{"_id":"@bitfloo/mailoo","_rev":"14-869182502eb47ae953dba17378df8b18","name":"@bitfloo/mailoo","dist-tags":{"latest":"0.3.5"},"versions":{"0.1.1":{"name":"@bitfloo/mailoo","version":"0.1.1","keywords":["email","mcp","imap","smtp","model-context-protocol","mcp-server","claude","anthropic","ai-tools","llm","nodejs"],"author":{"url":"https://github.com/bitfloo","name":"Bitfloo"},"license":"LGPL-3.0-or-later","_id":"@bitfloo/mailoo@0.1.1","maintainers":[{"name":"bitmike","email":"michal@bitfloo.com"}],"homepage":"https://github.com/bitfloo/mailoo#readme","bugs":{"url":"https://github.com/bitfloo/mailoo/issues"},"bin":{"mailoo":"dist/main.js"},"dist":{"shasum":"131e4f39e01c52a44c0df5dcabc2f115a75d365f","tarball":"https://registry.npmjs.org/@bitfloo/mailoo/-/mailoo-0.1.1.tgz","fileCount":357,"integrity":"sha512-IAhOHfT/EGFEuHqHjwm+rltu5d/OYin5yQpAaVIWVdJL1bJ7EFWwVMfbPLuhnaVshqlxWi5PIkoVgN943xTUkw==","signatures":[{"sig":"MEQCIHxZkA9n8n6Vl+d9JAK+sF0+3wzrvmga2y44Ixxg7Uu5AiAqCfJ2mXfuRXvf5Co/FsEtC6HDE17lUtsChtpq7DgRUA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1252053},"main":"./dist/main.js","type":"module","types":"./dist/main.d.ts","engines":{"node":">=24.0.0"},"mcpName":"io.github.bitfloo/mailoo","scripts":{"dev":"tsx watch src/main.ts","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check src/ && eslint src/","start":"node dist/main.js","commit":"cog commit","format":"biome format --write src/","report":"mkdir -p reports && biome check src/ --reporter=json > reports/biome.json 2>&1; eslint src/ -f json -o reports/eslint.json; actionlint -format '{{json .}}' > reports/actionlint.json 2>&1; pnpm test","prepare":"lefthook install || true","ci:local":"bash scripts/ci-local.sh","lint:fix":"eslint src/ --fix","test:all":"vitest run && vitest run --config vitest.config.integration.ts","changelog":"cog changelog","typecheck":"tsc --noEmit","docker:run":"docker run --rm -i -v ~/.config/mailoo:/home/node/.config/mailoo:ro ghcr.io/bitfloo/mailoo","test:watch":"vitest","version:log":"cog log","docker:build":"docker build -t ghcr.io/bitfloo/mailoo .","docker:clean":"docker images --format '{{.Repository}}:{{.Tag}}' | grep mailoo | xargs docker rmi -f 2>/dev/null; true","docker:prune":"docker image prune -f && docker buildx prune -f","format:check":"biome check src/","version:bump":"cog bump --auto","hooks:install":"lefthook install --force","release:check":"goreleaser check","test:coverage":"vitest run --coverage","version:check":"cog check","docker:compose":"docker compose up","prepublishOnly":"tsc -p tsconfig.build.json","hooks:uninstall":"lefthook uninstall","release:dry-run":"goreleaser release --skip=publish --clean && pnpm docker:clean","release:snapshot":"goreleaser release --snapshot --clean && pnpm docker:clean","test:integration":"vitest run --config vitest.config.integration.ts","version:bump:minor":"cog bump --minor","version:bump:patch":"cog bump --patch"},"_npmUser":{"name":"bitmike","email":"michal@bitfloo.com"},"repository":{"url":"git+https://github.com/bitfloo/mailoo.git","type":"git"},"_npmVersion":"10.9.7","description":"Mailoo — IMAP/SMTP MCP server. Multi-account, per-folder profiles.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"zod":"^4.3.6","imapflow":"^1.7.8","node-ical":"^0.25.2","smol-toml":"^1.6.0","nodemailer":"^8.0.1","@clack/prompts":"^1.0.1","@typesafe-ai/sdk":"^0.6.0","@modelcontextprotocol/sdk":"^1.26.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.15.0","devDependencies":{"tsx":"^4.21.0","eslint":"^9.39.2","vitest":"^4.0.18","lefthook":"^2.1.1","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/node":"^25.2.3","@biomejs/biome":"^2.4.2","@eslint/compat":"^2.0.2","testcontainers":"^11.12.0","@types/nodemailer":"^7.0.10","@vitest/coverage-v8":"^4.0.18","eslint-config-airbnb-extended":"^3.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mailoo_0.1.1_1790150398681_0.5275896056917","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@bitfloo/mailoo","version":"0.1.5","keywords":["email","mcp","imap","smtp","model-context-protocol","mcp-server","claude","anthropic","ai-tools","llm","nodejs"],"author":{"url":"https://github.com/Bitfloo","name":"Bitfloo"},"license":"LGPL-3.0-or-later","_id":"@bitfloo/mailoo@0.1.5","maintainers":[{"name":"bitmike","email":"michal@bitfloo.com"}],"homepage":"https://github.com/Bitfloo/mailoo#readme","bugs":{"url":"https://github.com/Bitfloo/mailoo/issues"},"bin":{"mailoo":"dist/main.js"},"dist":{"shasum":"207622413fc392a8b80cb7779d4c11c57dde59bc","tarball":"https://registry.npmjs.org/@bitfloo/mailoo/-/mailoo-0.1.5.tgz","fileCount":357,"integrity":"sha512-OWeW8drya7IR/DFy5du6IqsaA/kb/xIx0drxcGow7WHBpjNZkYe7n8AdDFRbDT1hKfPe/mTalcRwKsdpA+ijXQ==","signatures":[{"sig":"MEUCIEPiizV74kREWYgWzTqt0it+gYvjmSJYdvmTDxFcwDLtAiEAiZjohEOGaYDcOyFf3wMQnZuzmtCeDa2fnoPbubYt/Uw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICbqIdVp6GdllQ+iP3IdPvYSEDDg7DRkQctV8TCOX5Y8AiEAtacyIO2iotxpURN4+DyCKBfMb+bZU/kAHLWwt8/mcYg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bitfloo%2fmailoo@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1252112},"main":"./dist/main.js","type":"module","types":"./dist/main.d.ts","engines":{"node":">=24.0.0"},"gitHead":"ea905dc9cecce13b5c10761d01b7e3358e13fde5","mcpName":"io.github.Bitfloo/mailoo","scripts":{"dev":"tsx watch src/main.ts","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check src/ && eslint src/","start":"node dist/main.js","commit":"cog commit","format":"biome format --write src/","report":"mkdir -p reports && biome check src/ --reporter=json > reports/biome.json 2>&1; eslint src/ -f json -o reports/eslint.json; actionlint -format '{{json .}}' > reports/actionlint.json 2>&1; pnpm test","prepare":"lefthook install || true","ci:local":"bash scripts/ci-local.sh","lint:fix":"eslint src/ --fix","test:all":"vitest run && vitest run --config vitest.config.integration.ts","changelog":"cog changelog","typecheck":"tsc --noEmit","docker:run":"docker run --rm -i -v ~/.config/mailoo:/home/node/.config/mailoo:ro ghcr.io/bitfloo/mailoo","test:watch":"vitest","version:log":"cog log","docker:build":"docker build -t ghcr.io/bitfloo/mailoo .","docker:clean":"docker images --format '{{.Repository}}:{{.Tag}}' | grep mailoo | xargs docker rmi -f 2>/dev/null; true","docker:prune":"docker image prune -f && docker buildx prune -f","format:check":"biome check src/","version:bump":"cog bump --auto","hooks:install":"lefthook install --force","release:check":"goreleaser check","test:coverage":"vitest run --coverage","version:check":"cog check","docker:compose":"docker compose up","prepublishOnly":"tsc -p tsconfig.build.json","hooks:uninstall":"lefthook uninstall","release:dry-run":"goreleaser release --skip=publish --clean && pnpm docker:clean","release:snapshot":"goreleaser release --snapshot --clean && pnpm docker:clean","test:integration":"vitest run --config vitest.config.integration.ts","version:bump:minor":"cog bump --minor","version:bump:patch":"cog bump --patch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:45c5c649-6080-4a23-a79e-92f9cbf2ddc7"}},"repository":{"url":"git+https://github.com/Bitfloo/mailoo.git","type":"git"},"_npmVersion":"12.1.0","description":"Mailoo — IMAP/SMTP MCP server. Multi-account, per-folder profiles.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.3.6","imapflow":"^1.7.8","node-ical":"^0.25.2","smol-toml":"^1.6.0","nodemailer":"^8.0.1","@clack/prompts":"^1.0.1","@typesafe-ai/sdk":"^0.6.0","@modelcontextprotocol/sdk":"^1.26.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.15.0","devDependencies":{"tsx":"^4.21.0","eslint":"^9.39.2","vitest":"^4.0.18","lefthook":"^2.1.1","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/node":"^25.2.3","@biomejs/biome":"^2.4.2","@eslint/compat":"^2.0.2","testcontainers":"^11.12.0","@types/nodemailer":"^7.0.10","@vitest/coverage-v8":"^4.0.18","eslint-config-airbnb-extended":"^3.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mailoo_0.1.5_1790157042526_0.03912511049664569","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@bitfloo/mailoo","version":"0.1.6","keywords":["email","mcp","imap","smtp","model-context-protocol","mcp-server","claude","anthropic","ai-tools","llm","nodejs"],"author":{"url":"https://github.com/Bitfloo","name":"Bitfloo"},"license":"LGPL-3.0-or-later","_id":"@bitfloo/mailoo@0.1.6","maintainers":[{"name":"bitmike","email":"michal@bitfloo.com"}],"homepage":"https://github.com/Bitfloo/mailoo#readme","bugs":{"url":"https://github.com/Bitfloo/mailoo/issues"},"bin":{"mailoo":"dist/main.js"},"dist":{"shasum":"5b6f7c5b575f52883703da6f12d8543778382da5","tarball":"https://registry.npmjs.org/@bitfloo/mailoo/-/mailoo-0.1.6.tgz","fileCount":381,"integrity":"sha512-cwu9vax6kib0DTnB0GRxD3F/IE6KC8YamkcdcPPQn3D+lIzs6CXxly+3aii0Yvs3If2k6KuNfwdtxXDISEIcsw==","signatures":[{"sig":"MEQCIAT2rrs8FCIg2u9knhjP/nxE4yU499XYuR+CNz6nW3akAiB4+bhWzng2H17Q+idzwUGfbhiMNHBZBS13q+ns4aZGdQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICraaJMaRICQmxDEFHoZ2/pfSpIYSJymYGUZRkJFaoGGAiBMPmXrhgN5nDVLrWF0v0TI122uPtZA/7HTGfQYPXHkCA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bitfloo%2fmailoo@0.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1482779},"main":"./dist/main.js","type":"module","types":"./dist/main.d.ts","engines":{"node":">=24.0.0"},"gitHead":"08077740f5a2038e2c95e6fc2f01d1606959ad57","mcpName":"io.github.Bitfloo/mailoo","scripts":{"dev":"tsx watch src/main.ts","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check src/ && eslint src/","start":"node dist/main.js","commit":"cog commit","format":"biome format --write src/","report":"mkdir -p reports && biome check src/ --reporter=json > reports/biome.json 2>&1; eslint src/ -f json -o reports/eslint.json; actionlint -format '{{json .}}' > reports/actionlint.json 2>&1; pnpm test","prepare":"lefthook install || true","ci:local":"bash scripts/ci-local.sh","lint:fix":"eslint src/ --fix","test:all":"vitest run && vitest run --config vitest.config.integration.ts","changelog":"cog changelog","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json","docker:run":"docker run --rm -i -v ~/.config/mailoo:/home/node/.config/mailoo:ro ghcr.io/bitfloo/mailoo","test:watch":"vitest","version:log":"cog log","docker:build":"docker build -t ghcr.io/bitfloo/mailoo .","docker:clean":"docker images --format '{{.Repository}}:{{.Tag}}' | grep mailoo | xargs docker rmi -f 2>/dev/null; true","docker:prune":"docker image prune -f && docker buildx prune -f","format:check":"biome check src/","version:bump":"cog bump --auto","hooks:install":"lefthook install --force","release:check":"goreleaser check","test:coverage":"vitest run --coverage","version:check":"cog check","docker:compose":"docker compose up","prepublishOnly":"tsc -p tsconfig.build.json","hooks:uninstall":"lefthook uninstall","release:dry-run":"goreleaser release --skip=publish --clean && pnpm docker:clean","release:snapshot":"goreleaser release --snapshot --clean && pnpm docker:clean","test:integration":"vitest run --config vitest.config.integration.ts","version:bump:minor":"cog bump --minor","version:bump:patch":"cog bump --patch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:45c5c649-6080-4a23-a79e-92f9cbf2ddc7"}},"repository":{"url":"git+https://github.com/Bitfloo/mailoo.git","type":"git"},"_npmVersion":"11.20.0","description":"Mailoo — email MCP server for IMAP, SMTP, and ManageSieve. Multi-account, per-folder profiles.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"zod":"^4.3.6","imapflow":"^1.7.8","node-ical":"^0.25.2","smol-toml":"^1.9.0","nodemailer":"^10.0.11","@clack/prompts":"^1.0.1","@typesafe-ai/sdk":"^0.6.0","@modelcontextprotocol/sdk":"^1.30.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.15.0","devDependencies":{"tsx":"^4.21.0","eslint":"^9.39.2","vitest":"^4.1.11","lefthook":"^2.1.1","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/node":"^25.2.3","@biomejs/biome":"^2.4.2","@eslint/compat":"^2.0.2","testcontainers":"^11.12.0","@vitest/coverage-v8":"^4.1.11","eslint-config-airbnb-extended":"^3.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mailoo_0.1.6_1790599742227_0.9089279896284188","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@bitfloo/mailoo","version":"0.1.7","keywords":["email","mcp","imap","smtp","model-context-protocol","mcp-server","claude","anthropic","ai-tools","llm","nodejs"],"author":{"url":"https://github.com/Bitfloo","name":"Bitfloo"},"license":"LGPL-3.0-or-later","_id":"@bitfloo/mailoo@0.1.7","maintainers":[{"name":"bitmike","email":"michal@bitfloo.com"}],"homepage":"https://github.com/Bitfloo/mailoo#readme","bugs":{"url":"https://github.com/Bitfloo/mailoo/issues"},"bin":{"mailoo":"dist/main.js"},"dist":{"shasum":"6dc3dc52717636c4f050d9711b8e5a6fc5f9d0df","tarball":"https://registry.npmjs.org/@bitfloo/mailoo/-/mailoo-0.1.7.tgz","fileCount":381,"integrity":"sha512-drQWo14NLyrTgO2d5srTwgyW74GoJOxeD2VjFHHYpIYZrEKacHOoi2P8QdLNhJ2eYdvX1hvCE8DPGKe3RCWk/w==","signatures":[{"sig":"MEYCIQD4WTqJcK38iQr9Uh6ri+WX6IRkv2Uqesm1KxXKKLXoEwIhAPSemNg/9opiNtHCqbwywz1xsFDcuzttS0QsQJCn/ols","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIANGIkofBltH3hmxu62LG6YoG3mdTPX572cXADneRY7bAiEA16+n6A3Z7KmSFt71sUAe0RiBTqKwQvjcikgJp26eqVs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bitfloo%2fmailoo@0.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1496146},"main":"./dist/main.js","type":"module","types":"./dist/main.d.ts","engines":{"node":">=24.0.0"},"gitHead":"b564bfbfa97f1ea95e2cec129eac9d068dc05113","mcpName":"io.github.Bitfloo/mailoo","scripts":{"dev":"tsx watch src/main.ts","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check src/ && eslint src/","start":"node dist/main.js","commit":"cog commit","format":"biome format --write src/","report":"mkdir -p reports && biome check src/ --reporter=json > reports/biome.json 2>&1; eslint src/ -f json -o reports/eslint.json; actionlint -format '{{json .}}' > reports/actionlint.json 2>&1; pnpm test","prepare":"lefthook install || true","ci:local":"bash scripts/ci-local.sh","lint:fix":"eslint src/ --fix","test:all":"vitest run && vitest run --config vitest.config.integration.ts","changelog":"cog changelog","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json","docker:run":"docker run --rm -i -v ~/.config/mailoo:/home/node/.config/mailoo:ro ghcr.io/bitfloo/mailoo","test:watch":"vitest","version:log":"cog log","docker:build":"docker build -t ghcr.io/bitfloo/mailoo .","docker:clean":"docker images --format '{{.Repository}}:{{.Tag}}' | grep mailoo | xargs docker rmi -f 2>/dev/null; true","docker:prune":"docker image prune -f && docker buildx prune -f","format:check":"biome check src/","version:bump":"cog bump --auto","hooks:install":"lefthook install --force","release:check":"goreleaser check","test:coverage":"vitest run --coverage","version:check":"cog check","docker:compose":"docker compose up","prepublishOnly":"tsc -p tsconfig.build.json","hooks:uninstall":"lefthook uninstall","release:dry-run":"goreleaser release --skip=publish --clean && pnpm docker:clean","release:snapshot":"goreleaser release --snapshot --clean && pnpm docker:clean","test:integration":"vitest run --config vitest.config.integration.ts","version:bump:minor":"cog bump --minor","version:bump:patch":"cog bump --patch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"45c5c649-6080-4a23-a79e-92f9cbf2ddc7"}},"repository":{"url":"git+https://github.com/Bitfloo/mailoo.git","type":"git"},"_npmVersion":"11.20.0","description":"Mailoo — email MCP server for IMAP, SMTP, and ManageSieve. Multi-account, per-folder profiles.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"zod":"^4.3.6","imapflow":"^1.7.8","node-ical":"^0.25.2","smol-toml":"^1.9.0","nodemailer":"^10.0.11","@clack/prompts":"1.8.1","@typesafe-ai/sdk":"^0.6.0","@modelcontextprotocol/sdk":"^1.30.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.15.0","devDependencies":{"tsx":"^4.21.0","eslint":"^9.39.2","vitest":"^4.1.11","lefthook":"^2.1.1","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/node":"^25.2.3","@biomejs/biome":"^2.4.2","@eslint/compat":"^2.0.2","testcontainers":"^11.12.0","@vitest/coverage-v8":"^4.1.11","eslint-config-airbnb-extended":"^3.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mailoo_0.1.7_1790684374539_0.07523202447108712","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@bitfloo/mailoo","version":"0.1.8","keywords":["email","mcp","imap","smtp","model-context-protocol","mcp-server","claude","anthropic","ai-tools","llm","nodejs"],"author":{"url":"https://github.com/Bitfloo","name":"Bitfloo"},"license":"LGPL-3.0-or-later","_id":"@bitfloo/mailoo@0.1.8","maintainers":[{"name":"bitmike","email":"michal@bitfloo.com"}],"homepage":"https://github.com/Bitfloo/mailoo#readme","bugs":{"url":"https://github.com/Bitfloo/mailoo/issues"},"bin":{"mailoo":"dist/main.js"},"dist":{"shasum":"5cbbf941d7810c4a9328eefde301293eb460d0ce","tarball":"https://registry.npmjs.org/@bitfloo/mailoo/-/mailoo-0.1.8.tgz","fileCount":385,"integrity":"sha512-fYm+jluFVtdNksGrvbPxwzMByKQn7VcXjPMZWSgAlSOhofNdVXybMz3/k/cGCgLE27c/NQAhjgCbwf/6XAOEjA==","signatures":[{"sig":"MEQCIEghDbQoRsO9RxeaNSdf95cgkzwQnKHBA8dXqGVBB2P0AiB52eNOAEf8KZVWGOkB20yzQ2X9z+SoL+tx8uYGmlyknQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCeTwbbo8zm7qJ/aKLhy0Gr+8ui+MqiD6DpVxxEaMD+7gIgYQtmkdd5s4o0JMiAhxDyBhhmLT1mzF2hwGiditvMTH8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bitfloo%2fmailoo@0.1.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1506893},"main":"./dist/main.js","type":"module","types":"./dist/main.d.ts","engines":{"node":">=24.0.0"},"gitHead":"3117186b9ef50b0ff3af68907da9c1f2f0b5fd72","mcpName":"io.github.Bitfloo/mailoo","scripts":{"dev":"tsx watch src/main.ts","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check src/ && eslint src/","start":"node dist/main.js","commit":"cog commit","format":"biome format --write src/","report":"mkdir -p reports && biome check src/ --reporter=json > reports/biome.json 2>&1; eslint src/ -f json -o reports/eslint.json; actionlint -format '{{json .}}' > reports/actionlint.json 2>&1; pnpm test","prepare":"lefthook install || true","ci:local":"bash scripts/ci-local.sh","lint:fix":"eslint src/ --fix","test:all":"vitest run && vitest run --config vitest.config.integration.ts","changelog":"cog changelog","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json","docker:run":"docker run --rm -i -v ~/.config/mailoo:/home/node/.config/mailoo:ro ghcr.io/bitfloo/mailoo","test:watch":"vitest","version:log":"cog log","docker:build":"docker build -t ghcr.io/bitfloo/mailoo .","docker:clean":"docker images --format '{{.Repository}}:{{.Tag}}' | grep mailoo | xargs docker rmi -f 2>/dev/null; true","docker:prune":"docker image prune -f && docker buildx prune -f","format:check":"biome check src/","version:bump":"cog bump --auto","hooks:install":"lefthook install --force","release:check":"goreleaser check","test:coverage":"vitest run --coverage","version:check":"cog check","docker:compose":"docker compose up","prepublishOnly":"tsc -p tsconfig.build.json","hooks:uninstall":"lefthook uninstall","release:dry-run":"goreleaser release --skip=publish --clean && pnpm docker:clean","release:snapshot":"goreleaser release --snapshot --clean && pnpm docker:clean","test:integration":"vitest run --config vitest.config.integration.ts","version:bump:minor":"cog bump --minor","version:bump:patch":"cog bump --patch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"45c5c649-6080-4a23-a79e-92f9cbf2ddc7"}},"repository":{"url":"git+https://github.com/Bitfloo/mailoo.git","type":"git"},"_npmVersion":"11.20.0","description":"Mailoo — email MCP server for IMAP, SMTP, and ManageSieve. Multi-account, per-folder profiles.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"zod":"^4.3.6","imapflow":"^1.7.8","node-ical":"^0.25.2","smol-toml":"^1.9.0","nodemailer":"^10.0.11","@clack/prompts":"1.8.1","@typesafe-ai/sdk":"^0.6.0","@modelcontextprotocol/sdk":"^1.32.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.15.0","devDependencies":{"tsx":"^4.21.0","eslint":"^9.39.2","vitest":"^4.1.11","lefthook":"^2.1.1","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/node":"^25.2.3","@biomejs/biome":"^2.4.2","@eslint/compat":"^2.0.2","testcontainers":"^11.12.0","@vitest/coverage-v8":"^4.1.11","eslint-config-airbnb-extended":"^3.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mailoo_0.1.8_1791389354569_0.6302705732832277","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bitfloo/mailoo","version":"0.2.0","keywords":["email","mcp","imap","smtp","model-context-protocol","mcp-server","claude","anthropic","ai-tools","llm","nodejs"],"author":{"url":"https://github.com/Bitfloo","name":"Bitfloo"},"license":"LGPL-3.0-or-later","_id":"@bitfloo/mailoo@0.2.0","maintainers":[{"name":"bitmike","email":"michal@bitfloo.com"}],"homepage":"https://github.com/Bitfloo/mailoo#readme","bugs":{"url":"https://github.com/Bitfloo/mailoo/issues"},"bin":{"mailoo":"dist/main.js"},"dist":{"shasum":"e0c6d2e716548babcee54883d27490c83ade24f1","tarball":"https://registry.npmjs.org/@bitfloo/mailoo/-/mailoo-0.2.0.tgz","fileCount":389,"integrity":"sha512-+2ufmQdV6zl7otsZXyP+MUHYGNEDj6eu5CmCjZYI70EtLw1ZKbVzERVKdSlW7AlVqr6iPGW8+S0yNetmgI0RSQ==","signatures":[{"sig":"MEUCIEgSd0LC5JPqcIp3D8+kxEffI3BTPLtuPMLi1PJTgNXBAiEAu9noGulVEsqCaVDA6/Ro7TVze3Bs3au0kzsw8GIAw4E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCID0T/bChtKIUFDap0/UYobBkmPZyldqkJkRmkdt0IT8fAiBeAUDEU6Z8c9i/o7+r2GgC6D0wKP+V29Kk4Ag2nVrzuw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bitfloo%2fmailoo@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1522532},"main":"./dist/main.js","type":"module","types":"./dist/main.d.ts","engines":{"node":">=24.0.0"},"gitHead":"c52de9c74a4b34015548a7c34b3a16f46b1200e9","mcpName":"io.github.Bitfloo/mailoo","scripts":{"dev":"tsx watch src/main.ts","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check src/ && eslint src/","start":"node dist/main.js","commit":"cog commit","format":"biome format --write src/","report":"mkdir -p reports && biome check src/ --reporter=json > reports/biome.json 2>&1; eslint src/ -f json -o reports/eslint.json; actionlint -format '{{json .}}' > reports/actionlint.json 2>&1; pnpm test","prepare":"lefthook install || true","ci:local":"bash scripts/ci-local.sh","lint:fix":"eslint src/ --fix","test:all":"vitest run && vitest run --config vitest.config.integration.ts","changelog":"cog changelog","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json","docker:run":"docker run --rm -i -v ~/.config/mailoo:/home/node/.config/mailoo:ro ghcr.io/bitfloo/mailoo","test:watch":"vitest","version:log":"cog log","docker:build":"docker build -t ghcr.io/bitfloo/mailoo .","docker:clean":"docker images --format '{{.Repository}}:{{.Tag}}' | grep mailoo | xargs docker rmi -f 2>/dev/null; true","docker:prune":"docker image prune -f && docker buildx prune -f","format:check":"biome check src/","version:bump":"cog bump --auto","hooks:install":"lefthook install --force","release:check":"goreleaser check","test:coverage":"vitest run --coverage","version:check":"cog check","docker:compose":"docker compose up","prepublishOnly":"tsc -p tsconfig.build.json","hooks:uninstall":"lefthook uninstall","release:dry-run":"goreleaser release --skip=publish --clean && pnpm docker:clean","release:snapshot":"goreleaser release --snapshot --clean && pnpm docker:clean","test:integration":"vitest run --config vitest.config.integration.ts","version:bump:minor":"cog bump --minor","version:bump:patch":"cog bump --patch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"45c5c649-6080-4a23-a79e-92f9cbf2ddc7"}},"repository":{"url":"git+https://github.com/Bitfloo/mailoo.git","type":"git"},"_npmVersion":"11.20.0","description":"Mailoo — email MCP server for IMAP, SMTP, and ManageSieve. Multi-account, per-folder profiles.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"zod":"^4.3.6","imapflow":"^1.7.8","node-ical":"^0.25.2","smol-toml":"^1.9.0","nodemailer":"^10.0.11","@clack/prompts":"1.8.1","@typesafe-ai/sdk":"^0.6.0","@modelcontextprotocol/sdk":"^1.32.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.15.0","devDependencies":{"tsx":"^4.21.0","eslint":"^9.39.2","vitest":"^4.1.11","lefthook":"^2.1.1","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/node":"^25.2.3","@biomejs/biome":"^2.4.2","@eslint/compat":"^2.0.2","testcontainers":"^11.12.0","@vitest/coverage-v8":"^4.1.11","eslint-config-airbnb-extended":"^3.0.1"},"_npmOperationalInternal":{"tmp":"tmp/mailoo_0.2.0_1791544194606_0.3749127480256551","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@bitfloo/mailoo","version":"0.2.1","keywords":["email","mcp","imap","smtp","model-context-protocol","mcp-server","claude","anthropic","ai-tools","llm","nodejs"],"author":{"url":"https://github.com/Bitfloo","name":"Bitfloo"},"license":"LGPL-3.0-or-later","_id":"@bitfloo/mailoo@0.2.1","maintainers":[{"name":"bitmike","email":"michal@bitfloo.com"}],"homepage":"https://github.com/Bitfloo/mailoo#readme","bugs":{"url":"https://github.com/Bitfloo/mailoo/issues"},"bin":{"mailoo":"dist/main.js"},"dist":{"shasum":"a5f11ac8af74f3e6f9efd82f2df4ed2c824175ca","tarball":"https://registry.npmjs.org/@bitfloo/mailoo/-/mailoo-0.2.1.tgz","fileCount":389,"integrity":"sha512-Fbql9Lm7WrvDEDUg/tC7hChIkmpLphd9VYmb+Zccc6s2wD1KDEgFGJvi35naJWziZ1rZiI6ggRuhA9lydrIR7A==","signatures":[{"sig":"MEYCIQDWbSZ6AGZBKOikHiAtFvovji2+OC+WJ3MQcq9K3/aCpAIhAJO7Sjs3NTpscqBo4wmCmoHFhlZbENHLbn01Zr8w3KfR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDoJDv5bODREnFmQ2bQYsaujFnLIoL5GMzpVvv2jtazpQIhAOM5Kwb0cyxSvUIdbejs6jeemqZXiWz6mUY9OzWMvpEa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bitfloo%2fmailoo@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1524423},"main":"./dist/main.js","pnpm":{"overrides":{"uuid@<11.1.1":"^11.1.1"}},"type":"module","types":"./dist/main.d.ts","engines":{"node":">=24.0.0"},"gitHead":"d145680a0edf1d6bfd11b11f00ed9a77a53c4998","mcpName":"io.github.Bitfloo/mailoo","scripts":{"dev":"tsx watch src/main.ts","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check src/ && eslint src/","start":"node dist/main.js","commit":"cog commit","format":"biome format --write src/","report":"mkdir -p reports && biome check src/ --reporter=json > reports/biome.json 2>&1; eslint src/ -f json -o reports/eslint.json; actionlint -format '{{json .}}' > reports/actionlint.json 2>&1; pnpm test","prepare":"lefthook install || true","ci:local":"bash scripts/ci-local.sh","lint:fix":"eslint src/ --fix","test:all":"vitest run && vitest run --config vitest.config.integration.ts","changelog":"cog changelog","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json","docker:run":"docker run --rm -i -v ~/.config/mailoo:/home/node/.config/mailoo:ro ghcr.io/bitfloo/mailoo","test:watch":"vitest","version:log":"cog log","docker:build":"docker build -t ghcr.io/bitfloo/mailoo .","docker:clean":"docker images --format '{{.Repository}}:{{.Tag}}' | grep mailoo | xargs docker rmi -f 2>/dev/null; true","docker:prune":"docker image prune -f && docker buildx prune -f","format:check":"biome check src/","version:bump":"cog bump --auto","hooks:install":"lefthook install --force","release:check":"goreleaser check","test:coverage":"vitest run --coverage","version:check":"cog check","docker:compose":"docker compose up","prepublishOnly":"tsc -p tsconfig.build.json","hooks:uninstall":"lefthook uninstall","release:dry-run":"goreleaser release --skip=publish --clean && pnpm docker:clean","release:snapshot":"goreleaser release --snapshot --clean && pnpm docker:clean","test:integration":"vitest run --config vitest.config.integration.ts","version:bump:minor":"cog bump --minor","version:bump:patch":"cog bump --patch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"45c5c649-6080-4a23-a79e-92f9cbf2ddc7"}},"repository":{"url":"git+https://github.com/Bitfloo/mailoo.git","type":"git"},"_npmVersion":"11.21.1","description":"Mailoo — email MCP server for IMAP, SMTP, and ManageSieve. Multi-account, per-folder profiles.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"zod":"^4.3.6","imapflow":"^1.7.8","node-ical":"^0.25.2","smol-toml":"^1.9.0","nodemailer":"^10.0.11","@clack/prompts":"1.8.1","@typesafe-ai/sdk":"^0.6.0","@modelcontextprotocol/sdk":"^1.32.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.34.7","devDependencies":{"tsx":"^4.23.15","vite":"^7.3.7","eslint":"^9.39.5","vitest":"^4.1.12","lefthook":"^2.2.2","@eslint/js":"^9.39.5","typescript":"^5.9.3","@types/node":"^25.9.9","@biomejs/biome":"^2.4.2","@eslint/compat":"^2.1.1","testcontainers":"^11.14.0","@vitest/coverage-v8":"^4.1.12","eslint-config-airbnb-extended":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/mailoo_0.2.1_1792173556455_0.9248604800027784","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@bitfloo/mailoo","version":"0.2.2","keywords":["email","mcp","imap","smtp","model-context-protocol","mcp-server","claude","anthropic","ai-tools","llm","nodejs","calendar","reminders","managesieve","sieve","triage","scheduling","oauth2","ai-agents","email-automation"],"author":{"url":"https://github.com/Bitfloo","name":"Bitfloo"},"license":"LGPL-3.0-or-later","_id":"@bitfloo/mailoo@0.2.2","maintainers":[{"name":"bitmike","email":"michal@bitfloo.com"}],"homepage":"https://github.com/Bitfloo/mailoo#readme","bugs":{"url":"https://github.com/Bitfloo/mailoo/issues"},"bin":{"mailoo":"dist/main.js"},"dist":{"shasum":"fa50f2958e74a7fddf897d4f0fb0b382c93693e2","tarball":"https://registry.npmjs.org/@bitfloo/mailoo/-/mailoo-0.2.2.tgz","fileCount":398,"integrity":"sha512-GXmgsyycHlVUI+3d/Svw9NGv3G1+r5U/u+30fRx9PdlPI9imktDtKcJdlgMfzDfoBwBpzxWIUJOPGUww61tI7A==","signatures":[{"sig":"MEUCIQD8M3kIA9WhUsQjDLcHe5z69epMvihK7A+YEUbYb/mX9gIgabIIL2G4Ew0S/QkC2NrLcOMm5UehgnRnhSXUWazSDQo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCno+1i3gDmB0fDevgMGdQDTd0TJRaJ9ceg3zufK72MNwIgVFOXGixvioSAOED6rkVnHltcCvDm4SCI0Mr5lSZAe1I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bitfloo%2fmailoo@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1615866},"main":"./dist/main.js","type":"module","types":"./dist/main.d.ts","engines":{"node":">=24.0.0"},"gitHead":"4897574d81a3b21fde136f531309f9ecc39b2004","mcpName":"io.github.Bitfloo/mailoo","scripts":{"dev":"tsx watch src/main.ts","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check src/ && eslint src/","start":"node dist/main.js","commit":"cog commit","format":"biome format --write src/","report":"mkdir -p reports && biome check src/ --reporter=json > reports/biome.json 2>&1; eslint src/ -f json -o reports/eslint.json; actionlint -format '{{json .}}' > reports/actionlint.json 2>&1; pnpm test","prepare":"lefthook install || true","ci:local":"bash scripts/ci-local.sh","lint:fix":"eslint src/ --fix","test:all":"vitest run && vitest run --config vitest.config.integration.ts","changelog":"cog changelog","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json","docker:run":"docker run --rm -i -v ~/.config/mailoo:/home/node/.config/mailoo:ro ghcr.io/bitfloo/mailoo","test:watch":"vitest","version:log":"cog log","docker:build":"docker build -t ghcr.io/bitfloo/mailoo .","docker:clean":"docker images --format '{{.Repository}}:{{.Tag}}' | grep mailoo | xargs docker rmi -f 2>/dev/null; true","docker:prune":"docker image prune -f && docker buildx prune -f","format:check":"biome check src/","version:bump":"cog bump --auto","hooks:install":"lefthook install --force","release:check":"goreleaser check","test:coverage":"vitest run --coverage","version:check":"cog check","docker:compose":"docker compose up","prepublishOnly":"tsc -p tsconfig.build.json","hooks:uninstall":"lefthook uninstall","release:dry-run":"goreleaser release --skip=publish --clean && pnpm docker:clean","release:snapshot":"goreleaser release --snapshot --clean && pnpm docker:clean","test:integration":"vitest run --config vitest.config.integration.ts","version:bump:minor":"cog bump --minor","version:bump:patch":"cog bump --patch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"45c5c649-6080-4a23-a79e-92f9cbf2ddc7"}},"repository":{"url":"git+https://github.com/Bitfloo/mailoo.git","type":"git"},"_npmVersion":"11.21.1","description":"Email, calendar, reminders & ManageSieve MCP server (IMAP/SMTP, AI triage, scheduling, OAuth2).","directories":{},"_nodeVersion":"24.21.0","dependencies":{"zod":"^4.6.7","imapflow":"^1.7.8","node-ical":"^0.25.2","smol-toml":"^1.9.1","nodemailer":"^10.1.2","@clack/prompts":"1.8.1","@typesafe-ai/sdk":"^0.7.0","@modelcontextprotocol/sdk":"^1.32.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.34.7","devDependencies":{"tsx":"^4.23.15","vite":"^7.3.7","eslint":"^9.39.5","vitest":"^4.1.12","lefthook":"^2.2.2","@eslint/js":"^9.39.5","typescript":"^5.9.3","@types/node":"^25.9.9","@biomejs/biome":"^2.5.15","@eslint/compat":"^2.1.1","testcontainers":"^12.2.1","@vitest/coverage-v8":"^4.1.12","eslint-config-airbnb-extended":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/mailoo_0.2.2_1792327306115_0.5532718800110341","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bitfloo/mailoo","version":"0.3.0","keywords":["email","mcp","imap","smtp","model-context-protocol","mcp-server","claude","anthropic","ai-tools","llm","nodejs","calendar","reminders","managesieve","sieve","triage","scheduling","oauth2","ai-agents","email-automation"],"author":{"url":"https://github.com/Bitfloo","name":"Bitfloo"},"license":"LGPL-3.0-or-later","_id":"@bitfloo/mailoo@0.3.0","maintainers":[{"name":"bitmike","email":"michal@bitfloo.com"}],"homepage":"https://github.com/Bitfloo/mailoo#readme","bugs":{"url":"https://github.com/Bitfloo/mailoo/issues"},"bin":{"mailoo":"dist/main.js"},"dist":{"shasum":"6405666067591ff9f090fbc7864b4f6a1bf6a023","tarball":"https://registry.npmjs.org/@bitfloo/mailoo/-/mailoo-0.3.0.tgz","fileCount":494,"integrity":"sha512-bnwmRE/JHOXD7qEI4sOOMLVH5vt6eITB1W0LABI0nQXgkSWY885qkM7sH53Jf1bwA3oXM8KdE7WYjXH7JY7YEg==","signatures":[{"sig":"MEYCIQCIf1iGAd4m8w+/LC4xk5YkrtDt4n6Q36htLVc7mq0e0QIhANQDsT695fFVZU5FyqearNUUSq8avVMHPKit+6CvbL/U","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCPlZ+bluaC5JjIQMtqxRZ/1khME0IWrJSj0xVB/RU38wIgfdnFA6kR9q3PrOQos+tcuvysOxgH692PU5btOXgU3es=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bitfloo%2fmailoo@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1818644},"main":"./dist/main.js","type":"module","types":"./dist/main.d.ts","engines":{"node":">=24.0.0"},"gitHead":"86d22997396061063af0202d4bb77e9812cdd11a","mcpName":"io.github.Bitfloo/mailoo","scripts":{"dev":"tsx watch src/main.ts","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check src/ && eslint src/","start":"node dist/main.js","commit":"cog commit","format":"biome format --write src/","report":"mkdir -p reports && biome check src/ --reporter=json > reports/biome.json 2>&1; eslint src/ -f json -o reports/eslint.json; actionlint -format '{{json .}}' > reports/actionlint.json 2>&1; pnpm test","prepare":"lefthook install || true","ci:local":"bash scripts/ci-local.sh","lint:fix":"eslint src/ --fix","test:all":"vitest run && vitest run --config vitest.config.integration.ts","changelog":"cog changelog","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json","docker:run":"docker run --rm -i -v ~/.config/mailoo:/home/node/.config/mailoo:ro ghcr.io/bitfloo/mailoo","test:watch":"vitest","version:log":"cog log","docker:build":"docker build -t ghcr.io/bitfloo/mailoo .","docker:clean":"docker images --format '{{.Repository}}:{{.Tag}}' | grep mailoo | xargs docker rmi -f 2>/dev/null; true","docker:prune":"docker image prune -f && docker buildx prune -f","format:check":"biome check src/","version:bump":"cog bump --auto","hooks:install":"lefthook install --force","release:check":"goreleaser check","test:coverage":"vitest run --coverage","version:check":"cog check","docker:compose":"docker compose up","prepublishOnly":"tsc -p tsconfig.build.json","hooks:uninstall":"lefthook uninstall","release:dry-run":"goreleaser release --skip=publish --clean && pnpm docker:clean","release:snapshot":"goreleaser release --snapshot --clean && pnpm docker:clean","test:integration":"vitest run --config vitest.config.integration.ts","version:bump:minor":"cog bump --minor","version:bump:patch":"cog bump --patch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"45c5c649-6080-4a23-a79e-92f9cbf2ddc7"}},"repository":{"url":"git+https://github.com/Bitfloo/mailoo.git","type":"git"},"_npmVersion":"11.21.1","description":"Email, calendar, reminders & ManageSieve MCP server (IMAP/SMTP, AI triage, scheduling, OAuth2).","directories":{},"_nodeVersion":"24.21.0","dependencies":{"zod":"^4.6.7","imapflow":"^2.5.8","node-ical":"^0.25.2","smol-toml":"^1.9.1","nodemailer":"^10.1.2","@clack/prompts":"1.8.1","@typesafe-ai/sdk":"^0.7.0","@modelcontextprotocol/sdk":"^1.32.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@12.13.0","devDependencies":{"tsx":"^4.23.15","vite":"^7.3.7","yaml":"^2.9.1","eslint":"^9.39.5","vitest":"^4.1.12","lefthook":"^2.2.2","@eslint/js":"^9.39.5","typescript":"~6.0.3","@types/node":"^25.9.9","@biomejs/biome":"^2.5.15","@eslint/compat":"^2.1.1","testcontainers":"^12.2.1","@vitest/coverage-v8":"^4.1.12","eslint-config-airbnb-extended":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/mailoo_0.3.0_1793030446605_0.35348865190838286","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@bitfloo/mailoo","version":"0.3.1","keywords":["email","mcp","mcp-server","model-context-protocol","mcp-email","email-mcp","imap","imap-mcp","smtp","mail","gmail","outlook","microsoft-365","claude","claude-code","claude-desktop","cursor","anthropic","ai","ai-agents","llm","email-automation","calendar","reminders","managesieve","sieve","triage","oauth2"],"author":{"url":"https://github.com/Bitfloo","name":"Bitfloo"},"license":"LGPL-3.0-or-later","_id":"@bitfloo/mailoo@0.3.1","maintainers":[{"name":"bitmike","email":"michal@bitfloo.com"}],"homepage":"https://github.com/Bitfloo/mailoo#readme","bugs":{"url":"https://github.com/Bitfloo/mailoo/issues"},"bin":{"mailoo":"dist/main.js"},"dist":{"shasum":"be0168842118328acf02b36efc5a69765b2cc2ca","tarball":"https://registry.npmjs.org/@bitfloo/mailoo/-/mailoo-0.3.1.tgz","fileCount":498,"integrity":"sha512-pNwl3ifdLJRNXlk01xIdX3Uvag/RaIqYrcHxHWChS4AKMq2Uh7nt3SIp+NrCz/wUW5Z1Q/D8AnkNDbiRRIq3kw==","signatures":[{"sig":"MEQCIA1dnE/B8HX8mmyqSxO11MmcpyYrWKbcqgA8kO6InRuHAiABelbIblLLkjrKg2xYVtIGVNsyMVSxHwhBhQgan1J7GQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHsTq3KtKVOkoehVNRfHaSm+iTyXHQBu2Fdsej7+ZcJGAiEAhSfQwFsJBrHDEP2s2V4+ATmtCSEGJDxamRLFAIRDV1A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bitfloo%2fmailoo@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1832788},"main":"./dist/main.js","type":"module","types":"./dist/main.d.ts","engines":{"node":">=24.0.0"},"gitHead":"8c575659a3706fd7b60a3db04e2ce7a938e9a7af","mcpName":"io.github.Bitfloo/mailoo","scripts":{"dev":"tsx watch src/main.ts","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check src/ && eslint src/","start":"node dist/main.js","commit":"cog commit","format":"biome format --write src/","report":"mkdir -p reports && biome check src/ --reporter=json > reports/biome.json 2>&1; eslint src/ -f json -o reports/eslint.json; actionlint -format '{{json .}}' > reports/actionlint.json 2>&1; pnpm test","prepare":"lefthook install || true","ci:local":"bash scripts/ci-local.sh","lint:fix":"eslint src/ --fix","test:all":"vitest run && vitest run --config vitest.config.integration.ts","changelog":"cog changelog","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json","docker:run":"docker run --rm -i -v ~/.config/mailoo:/home/node/.config/mailoo:ro ghcr.io/bitfloo/mailoo","test:watch":"vitest","version:log":"cog log","docker:build":"docker build -t ghcr.io/bitfloo/mailoo .","docker:clean":"docker images --format '{{.Repository}}:{{.Tag}}' | grep mailoo | xargs docker rmi -f 2>/dev/null; true","docker:prune":"docker image prune -f && docker buildx prune -f","format:check":"biome check src/","version:bump":"cog bump --auto","hooks:install":"lefthook install --force","release:check":"goreleaser check","test:coverage":"vitest run --coverage","version:check":"cog check","docker:compose":"docker compose up","prepublishOnly":"tsc -p tsconfig.build.json","hooks:uninstall":"lefthook uninstall","release:dry-run":"goreleaser release --skip=publish --clean && pnpm docker:clean","release:snapshot":"goreleaser release --snapshot --clean && pnpm docker:clean","test:integration":"vitest run --config vitest.config.integration.ts","version:bump:minor":"cog bump --minor","version:bump:patch":"cog bump --patch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"45c5c649-6080-4a23-a79e-92f9cbf2ddc7"}},"repository":{"url":"git+https://github.com/Bitfloo/mailoo.git","type":"git"},"_npmVersion":"11.21.1","description":"Email MCP server for AI agents: IMAP/SMTP, Gmail, Outlook, calendar, ManageSieve, AI triage, OAuth2.","directories":{},"_nodeVersion":"24.22.1","dependencies":{"zod":"^4.6.7","imapflow":"^2.5.8","node-ical":"^0.27.3","smol-toml":"^1.9.1","nodemailer":"^10.1.2","@clack/prompts":"1.8.1","@typesafe-ai/sdk":"^0.7.0","@modelcontextprotocol/sdk":"^1.32.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@12.15.0","devDependencies":{"tsx":"^4.23.15","vite":"^7.3.7","yaml":"^2.9.1","eslint":"^9.39.5","vitest":"^4.1.12","lefthook":"^2.2.2","@eslint/js":"^9.39.5","typescript":"~6.0.3","@types/node":"^25.9.9","@biomejs/biome":"^2.5.15","@eslint/compat":"^2.1.1","testcontainers":"^12.2.1","@vitest/coverage-v8":"^4.1.12","eslint-config-airbnb-extended":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/mailoo_0.3.1_1793265585976_0.6032990998937192","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@bitfloo/mailoo","version":"0.3.2","keywords":["email","mcp","mcp-server","model-context-protocol","mcp-email","email-mcp","imap","imap-mcp","smtp","mail","gmail","outlook","microsoft-365","claude","claude-code","claude-desktop","cursor","anthropic","ai","ai-agents","llm","email-automation","calendar","reminders","managesieve","sieve","triage","oauth2"],"author":{"url":"https://github.com/Bitfloo","name":"Bitfloo"},"license":"LGPL-3.0-or-later","_id":"@bitfloo/mailoo@0.3.2","maintainers":[{"name":"bitmike","email":"michal@bitfloo.com"}],"homepage":"https://github.com/Bitfloo/mailoo#readme","bugs":{"url":"https://github.com/Bitfloo/mailoo/issues"},"bin":{"mailoo":"dist/main.js"},"dist":{"shasum":"0881edd0378fd86e7c031a6c5f69db3a89963a90","tarball":"https://registry.npmjs.org/@bitfloo/mailoo/-/mailoo-0.3.2.tgz","fileCount":498,"integrity":"sha512-FNV/cX1T3UsGfgKuVh7hJSNENRbKKAISBVrUx3SxNKYZOzsLnzkiam4AaRp1+gY5Qw8diIZxPAchyuFBTvHHnA==","signatures":[{"sig":"MEQCIChNuhF1uvLXJotzi9iQVSVVJlDVwUjuycxg922NOTjFAiB9Y/+2IlDf6I0SN8LApuA5c/AIuqONykWduQB48vJfDQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAzdtS2L8xCAuIjO9dReepP3mTvRKhwGVLofsxiUqH3tAiAqODzbbv0PBKTpm7a5QAvIF9hjrBO0qv0LLnPNEeenog==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bitfloo%2fmailoo@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1833642},"main":"./dist/main.js","type":"module","types":"./dist/main.d.ts","engines":{"node":">=24.0.0"},"gitHead":"55ea3413cea00ba14621f5ccef448d6fdba0103e","mcpName":"io.github.Bitfloo/mailoo","scripts":{"dev":"tsx watch src/main.ts","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check src/ && eslint src/","start":"node dist/main.js","commit":"cog commit","format":"biome format --write src/","report":"mkdir -p reports && biome check src/ --reporter=json > reports/biome.json 2>&1; eslint src/ -f json -o reports/eslint.json; actionlint -format '{{json .}}' > reports/actionlint.json 2>&1; pnpm test","prepare":"lefthook install || true","ci:local":"bash scripts/ci-local.sh","lint:fix":"eslint src/ --fix","test:all":"vitest run && vitest run --config vitest.config.integration.ts","changelog":"cog changelog","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json","docker:run":"docker run --rm -i -v ~/.config/mailoo:/home/node/.config/mailoo:ro ghcr.io/bitfloo/mailoo","test:watch":"vitest","version:log":"cog log","docker:build":"docker build -t ghcr.io/bitfloo/mailoo .","docker:clean":"docker images --format '{{.Repository}}:{{.Tag}}' | grep mailoo | xargs docker rmi -f 2>/dev/null; true","docker:prune":"docker image prune -f && docker buildx prune -f","format:check":"biome check src/","version:bump":"cog bump --auto","hooks:install":"lefthook install --force","release:check":"goreleaser check","test:coverage":"vitest run --coverage","version:check":"cog check","docker:compose":"docker compose up","prepublishOnly":"tsc -p tsconfig.build.json","hooks:uninstall":"lefthook uninstall","release:dry-run":"goreleaser release --skip=publish --clean && pnpm docker:clean","release:snapshot":"goreleaser release --snapshot --clean && pnpm docker:clean","test:integration":"vitest run --config vitest.config.integration.ts","version:bump:minor":"cog bump --minor","version:bump:patch":"cog bump --patch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"45c5c649-6080-4a23-a79e-92f9cbf2ddc7"}},"repository":{"url":"git+https://github.com/Bitfloo/mailoo.git","type":"git"},"_npmVersion":"11.21.1","description":"Email MCP server for AI agents: IMAP/SMTP, Gmail, Outlook, calendar, ManageSieve, AI triage, OAuth2.","directories":{},"_nodeVersion":"24.22.1","dependencies":{"zod":"^4.6.7","imapflow":"^2.5.8","node-ical":"^0.27.3","smol-toml":"^1.9.1","nodemailer":"^10.1.2","@clack/prompts":"1.8.1","@typesafe-ai/sdk":"^0.7.0","@modelcontextprotocol/sdk":"^1.32.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@12.15.0","devDependencies":{"tsx":"^4.23.15","vite":"^7.3.7","yaml":"^2.9.1","eslint":"^9.39.5","vitest":"^4.1.12","lefthook":"^2.2.2","@eslint/js":"^9.39.5","typescript":"~6.0.3","@types/node":"^25.9.9","@biomejs/biome":"^2.5.15","@eslint/compat":"^2.1.1","testcontainers":"^12.2.1","@vitest/coverage-v8":"^4.1.12","eslint-config-airbnb-extended":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/mailoo_0.3.2_1793293361846_0.823432929334106","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@bitfloo/mailoo","version":"0.3.3","keywords":["email","mcp","mcp-server","model-context-protocol","mcp-email","email-mcp","imap","imap-mcp","smtp","mail","gmail","outlook","microsoft-365","claude","claude-code","claude-desktop","cursor","anthropic","ai","ai-agents","llm","email-automation","calendar","reminders","managesieve","sieve","triage","oauth2"],"author":{"url":"https://github.com/Bitfloo","name":"Bitfloo"},"license":"LGPL-3.0-or-later","_id":"@bitfloo/mailoo@0.3.3","maintainers":[{"name":"bitmike","email":"michal@bitfloo.com"}],"homepage":"https://github.com/Bitfloo/mailoo#readme","bugs":{"url":"https://github.com/Bitfloo/mailoo/issues"},"bin":{"mailoo":"dist/main.js"},"dist":{"shasum":"b7ff9168b0bf382ad252e4c8c917f4a72135ff83","tarball":"https://registry.npmjs.org/@bitfloo/mailoo/-/mailoo-0.3.3.tgz","fileCount":498,"integrity":"sha512-s6H2OBhIjpNMDkaE9DqQOD4GMUyOn5a6poNoczct9rRMKoYwZIvqvYMyR8S9EkwSNHUL7+GaMe9afZvkdXtWnw==","signatures":[{"sig":"MEUCIHN23usC73JPGxHPn/vA1bGgC2+/16yqN9Oi5YeWVCs/AiEAxzPiFwKgTnVYmZ/Zl255Pj2v4oO4INtr2x1j7cbPMAg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCdimywKnX2mcruRaPbtKZFVaUNYc0qfgejlCu6KNpffAIgah2FoZGKd+RpJPIYZMlVN1ZeIqqiyHn+OQ7z/70tDPI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bitfloo%2fmailoo@0.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1833603},"main":"./dist/main.js","type":"module","types":"./dist/main.d.ts","engines":{"node":">=24.0.0"},"gitHead":"c47802d50e39fe18e956ad6cc88066309815b5d3","mcpName":"io.github.Bitfloo/mailoo","scripts":{"dev":"tsx watch src/main.ts","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check src/ && eslint src/","start":"node dist/main.js","commit":"cog commit","format":"biome format --write src/","report":"mkdir -p reports && biome check src/ --reporter=json > reports/biome.json 2>&1; eslint src/ -f json -o reports/eslint.json; actionlint -format '{{json .}}' > reports/actionlint.json 2>&1; pnpm test","prepare":"lefthook install || true","ci:local":"bash scripts/ci-local.sh","lint:fix":"eslint src/ --fix","test:all":"vitest run && vitest run --config vitest.config.integration.ts","changelog":"cog changelog","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json","docker:run":"docker run --rm -i -v ~/.config/mailoo:/home/node/.config/mailoo:ro ghcr.io/bitfloo/mailoo","test:watch":"vitest","version:log":"cog log","docker:build":"docker build -t ghcr.io/bitfloo/mailoo .","docker:clean":"docker images --format '{{.Repository}}:{{.Tag}}' | grep mailoo | xargs docker rmi -f 2>/dev/null; true","docker:prune":"docker image prune -f && docker buildx prune -f","format:check":"biome check src/","hooks:install":"lefthook install --force","release:check":"goreleaser check","test:coverage":"vitest run --coverage","version:check":"cog check","docker:compose":"docker compose up","prepublishOnly":"tsc -p tsconfig.build.json","hooks:uninstall":"lefthook uninstall","release:dry-run":"goreleaser release --skip=publish --clean && pnpm docker:clean","release:snapshot":"goreleaser release --snapshot --clean && pnpm docker:clean","test:integration":"vitest run --config vitest.config.integration.ts","version:bump:minor":"cog bump --minor","version:bump:patch":"cog bump --patch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"45c5c649-6080-4a23-a79e-92f9cbf2ddc7"}},"repository":{"url":"git+https://github.com/Bitfloo/mailoo.git","type":"git"},"_npmVersion":"11.21.1","description":"Email MCP server for AI agents: IMAP/SMTP, Gmail, Outlook, calendar, ManageSieve, AI triage, OAuth2.","directories":{},"_nodeVersion":"24.22.1","dependencies":{"zod":"^4.6.7","imapflow":"^2.5.8","node-ical":"^0.27.3","smol-toml":"^1.9.1","nodemailer":"^10.1.2","@clack/prompts":"1.8.1","@typesafe-ai/sdk":"^0.7.0","@modelcontextprotocol/sdk":"^1.32.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@12.15.0","devDependencies":{"tsx":"^4.23.15","vite":"^7.3.7","yaml":"^2.9.1","eslint":"^9.39.5","vitest":"^4.1.12","lefthook":"^2.2.2","@eslint/js":"^9.39.5","typescript":"~6.0.3","@types/node":"^25.9.9","@biomejs/biome":"^2.5.15","@eslint/compat":"^2.1.1","testcontainers":"^12.2.1","@vitest/coverage-v8":"^4.1.12","eslint-config-airbnb-extended":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/mailoo_0.3.3_1793296036503_0.10264567131536384","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@bitfloo/mailoo","version":"0.3.4","keywords":["email","mcp","mcp-server","model-context-protocol","mcp-email","email-mcp","imap","imap-mcp","smtp","mail","gmail","outlook","microsoft-365","claude","claude-code","claude-desktop","cursor","anthropic","ai","ai-agents","llm","email-automation","calendar","reminders","managesieve","sieve","triage","oauth2"],"author":{"url":"https://github.com/Bitfloo","name":"Bitfloo"},"license":"LGPL-3.0-or-later","_id":"@bitfloo/mailoo@0.3.4","maintainers":[{"name":"bitmike","email":"michal@bitfloo.com"}],"homepage":"https://github.com/Bitfloo/mailoo#readme","bugs":{"url":"https://github.com/Bitfloo/mailoo/issues"},"bin":{"mailoo":"dist/main.js"},"dist":{"shasum":"0bb8b6d7e28c8d9d554ea46d9b7977f00b422215","tarball":"https://registry.npmjs.org/@bitfloo/mailoo/-/mailoo-0.3.4.tgz","fileCount":502,"integrity":"sha512-CllJ044BWeHqZecCbKN/RsajZLgwNF+ZPSydc75ifR/4ttW36P+BeDpdEiOOTbHyQEaLyp9AQVSDunHOWmbn6w==","signatures":[{"sig":"MEUCIGZO69vlqVBgRM8BR5iejNHks4PvTNJZ7/hRvs7i4Fg4AiEAzJe7ss9xN/copldouSfoSRDeV2H+N7Hor9sxR4hBWzo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIG9pv2b/EzzpddvuUW+BMzoV2n6r4aowC23YnP2gfkCbAiAtkrnI+qzt5KNZlEQsypOY0sKO4byOBE5NrNZ+O51Xew==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bitfloo%2fmailoo@0.3.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1864506},"main":"./dist/main.js","type":"module","types":"./dist/main.d.ts","engines":{"node":">=24.0.0"},"gitHead":"f377a915e5baae442629671c28f00d0869e24b89","mcpName":"io.github.Bitfloo/mailoo","scripts":{"dev":"tsx watch src/main.ts","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check src/ && eslint src/","start":"node dist/main.js","commit":"cog commit","format":"biome format --write src/","report":"mkdir -p reports && biome check src/ --reporter=json > reports/biome.json 2>&1; eslint src/ -f json -o reports/eslint.json; actionlint -format '{{json .}}' > reports/actionlint.json 2>&1; pnpm test","prepare":"lefthook install || true","ci:local":"bash scripts/ci-local.sh","lint:fix":"eslint src/ --fix","test:all":"vitest run && vitest run --config vitest.config.integration.ts","changelog":"cog changelog","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json","docker:run":"docker run --rm -i -v ~/.config/mailoo:/home/node/.config/mailoo:ro ghcr.io/bitfloo/mailoo","test:watch":"vitest","version:log":"cog log","docker:build":"docker build -t ghcr.io/bitfloo/mailoo .","docker:clean":"docker images --format '{{.Repository}}:{{.Tag}}' | grep mailoo | xargs docker rmi -f 2>/dev/null; true","docker:prune":"docker image prune -f && docker buildx prune -f","format:check":"biome check src/","hooks:install":"lefthook install --force","release:check":"goreleaser check","test:coverage":"vitest run --coverage","version:check":"cog check","docker:compose":"docker compose up","prepublishOnly":"tsc -p tsconfig.build.json","hooks:uninstall":"lefthook uninstall","release:dry-run":"goreleaser release --skip=publish --clean && pnpm docker:clean","release:snapshot":"goreleaser release --snapshot --clean && pnpm docker:clean","test:integration":"vitest run --config vitest.config.integration.ts","version:bump:minor":"cog bump --minor","version:bump:patch":"cog bump --patch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"45c5c649-6080-4a23-a79e-92f9cbf2ddc7"}},"repository":{"url":"git+https://github.com/Bitfloo/mailoo.git","type":"git"},"_npmVersion":"11.21.1","description":"Email MCP server for AI agents: IMAP/SMTP, Gmail, Outlook, calendar, ManageSieve, AI triage, OAuth2.","directories":{},"_nodeVersion":"24.22.1","dependencies":{"zod":"^4.6.7","imapflow":"^2.5.8","node-ical":"^0.27.3","smol-toml":"^1.9.1","nodemailer":"^10.1.2","@clack/prompts":"1.8.1","@typesafe-ai/sdk":"^0.7.0","@modelcontextprotocol/sdk":"^1.32.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@12.16.1","devDependencies":{"tsx":"^4.23.15","vite":"^7.3.7","yaml":"^2.9.1","eslint":"^9.39.5","vitest":"^4.1.12","lefthook":"^2.2.2","@eslint/js":"^9.39.5","typescript":"~6.0.3","@types/node":"^25.9.9","@biomejs/biome":"^2.5.15","@eslint/compat":"^2.1.1","testcontainers":"^12.2.1","@vitest/coverage-v8":"^4.1.12","eslint-config-airbnb-extended":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/mailoo_0.3.4_1793433928164_0.9596428313941678","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"_id":"@bitfloo/mailoo@0.3.5","bin":{"mailoo":"dist/main.js"},"bugs":{"url":"https://github.com/Bitfloo/mailoo/issues"},"dist":{"shasum":"7ea143268dca3b620130b79487467f5c61ca6347","tarball":"https://registry.npmjs.org/@bitfloo/mailoo/-/mailoo-0.3.5.tgz","fileCount":504,"integrity":"sha512-QjMf89t8QetLuaWU32Hbt/LM4HrotKwSVKIXW7lU1Mr/Wb8Prj8bL4TNa2NCchMtlasCArV3bYaH3wenoAPBJg==","signatures":[{"sig":"MEQCIFJIMMac8S9DgaVIZa9dCp4+Fz9sMD396JfoWd9Bs0amAiAh8Ds/UoS/+fC7rZNyOZy40Ni+mjpNu5ZKPHNb/N5Paw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGKmsdkCgBACH+bt2o84mxUHH7PvmpifE76zfitjBIHrAiEAoj+OxxJbETi4sxrqIT4J2zhqP22bOkW9RyjLswRqPcs="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bitfloo%2fmailoo@0.3.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1906192},"main":"./dist/main.js","name":"@bitfloo/mailoo","type":"module","types":"./dist/main.d.ts","author":{"url":"https://github.com/Bitfloo","name":"Bitfloo"},"engines":{"node":">=24.0.0"},"gitHead":"84ea5197809142c335c0dedd744e0f29171a9dcc","license":"LGPL-3.0-or-later","mcpName":"io.github.Bitfloo/mailoo","scripts":{"dev":"tsx watch src/main.ts","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check src/ && eslint src/","start":"node dist/main.js","commit":"cog commit","format":"biome format --write src/","report":"mkdir -p reports && biome check src/ --reporter=json > reports/biome.json 2>&1; eslint src/ -f json -o reports/eslint.json; actionlint -format '{{json .}}' > reports/actionlint.json 2>&1; pnpm test","prepare":"lefthook install || true","ci:local":"bash scripts/ci-local.sh","lint:fix":"eslint src/ --fix","test:all":"vitest run && vitest run --config vitest.config.integration.ts","test:e2e":"vitest run --config vitest.config.integration.ts src/__integration__/package-journey.integration.test.ts","changelog":"cog changelog","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json","ci:release":"pnpm ci:local -- --require-integration","docker:run":"docker run --rm -i -v ~/.config/mailoo:/home/node/.config/mailoo:ro ghcr.io/bitfloo/mailoo","test:watch":"vitest","version:log":"cog log","docker:build":"docker build -t ghcr.io/bitfloo/mailoo .","docker:clean":"docker images --format '{{.Repository}}:{{.Tag}}' | grep mailoo | xargs docker rmi -f 2>/dev/null; true","docker:prune":"docker image prune -f && docker buildx prune -f","format:check":"biome check src/","hooks:install":"lefthook install --force","release:check":"goreleaser check","test:coverage":"vitest run --coverage","version:check":"cog check","docker:compose":"docker compose up","prepublishOnly":"tsc -p tsconfig.build.json","hooks:uninstall":"lefthook uninstall","release:dry-run":"goreleaser release --skip=publish --clean && pnpm docker:clean","release:snapshot":"goreleaser release --snapshot --clean && pnpm docker:clean","test:integration":"vitest run --config vitest.config.integration.ts","version:bump:minor":"cog bump --minor","version:bump:patch":"cog bump --patch"},"version":"0.3.5","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"45c5c649-6080-4a23-a79e-92f9cbf2ddc7"}},"homepage":"https://github.com/Bitfloo/mailoo#readme","keywords":["email","mcp","mcp-server","model-context-protocol","mcp-email","email-mcp","imap","imap-mcp","smtp","mail","gmail","outlook","microsoft-365","claude","claude-code","claude-desktop","cursor","anthropic","ai","ai-agents","llm","email-automation","calendar","reminders","managesieve","sieve","triage","oauth2"],"repository":{"url":"git+https://github.com/Bitfloo/mailoo.git","type":"git"},"_npmVersion":"11.21.1","description":"Email MCP server for AI agents: IMAP/SMTP, Gmail, Outlook, calendar, ManageSieve, AI triage, OAuth2.","directories":{},"maintainers":[{"name":"bitmike","email":"michal@bitfloo.com"}],"_nodeVersion":"24.22.1","dependencies":{"zod":"^4.6.7","imapflow":"^2.5.8","node-ical":"^0.27.3","smol-toml":"^1.9.1","nodemailer":"^10.1.2","@clack/prompts":"1.8.1","@typesafe-ai/sdk":"^0.7.0","@modelcontextprotocol/sdk":"^1.32.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@12.16.1","devDependencies":{"tsx":"^4.23.15","vite":"^7.3.7","yaml":"^2.9.1","eslint":"^9.39.5","vitest":"^4.1.12","lefthook":"^2.2.2","@eslint/js":"^9.39.5","typescript":"~6.0.3","@types/node":"^25.9.9","@biomejs/biome":"^2.5.15","@eslint/compat":"^2.1.1","testcontainers":"^12.2.1","@vitest/coverage-v8":"^4.1.12","eslint-config-airbnb-extended":"^3.3.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mailoo_0.3.5_1793446831199_0.21077887413701613"}}},"time":{"created":"2026-09-23T07:59:58.271Z","modified":"2026-10-31T11:40:31.696Z","0.1.1":"2026-09-23T07:59:58.879Z","0.1.5":"2026-09-23T09:50:42.606Z","0.1.6":"2026-09-28T12:49:02.460Z","0.1.7":"2026-09-29T12:19:34.647Z","0.1.8":"2026-10-07T16:09:14.700Z","0.2.0":"2026-10-09T11:09:54.696Z","0.2.1":"2026-10-16T17:59:16.563Z","0.2.2":"2026-10-18T12:41:46.253Z","0.3.0":"2026-10-26T16:00:46.802Z","0.3.1":"2026-10-29T09:19:46.114Z","0.3.2":"2026-10-29T17:02:41.984Z","0.3.3":"2026-10-29T17:47:16.666Z","0.3.4":"2026-10-31T08:05:28.267Z","0.3.5":"2026-10-31T11:40:31.319Z"},"bugs":{"url":"https://github.com/Bitfloo/mailoo/issues"},"author":{"url":"https://github.com/Bitfloo","name":"Bitfloo"},"license":"LGPL-3.0-or-later","homepage":"https://github.com/Bitfloo/mailoo#readme","keywords":["email","mcp","mcp-server","model-context-protocol","mcp-email","email-mcp","imap","imap-mcp","smtp","mail","gmail","outlook","microsoft-365","claude","claude-code","claude-desktop","cursor","anthropic","ai","ai-agents","llm","email-automation","calendar","reminders","managesieve","sieve","triage","oauth2"],"repository":{"url":"git+https://github.com/Bitfloo/mailoo.git","type":"git"},"description":"Email MCP server for AI agents: IMAP/SMTP, Gmail, Outlook, calendar, ManageSieve, AI triage, OAuth2.","maintainers":[{"name":"bitmike","email":"michal@bitfloo.com"}],"readme":"# Mailoo\n\n[![standard-readme compliant](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme)\n[![license](https://img.shields.io/github/license/bitfloo/mailoo.svg?style=flat-square)](LICENSE)\n[![CI](https://img.shields.io/github/actions/workflow/status/bitfloo/mailoo/ci.yml?event=pull_request&style=flat-square&label=CI)](https://github.com/bitfloo/mailoo/actions/workflows/ci.yml)\n[![M8ven](https://m8ven.ai/badge/mcp/bitfloo/mailoo?variant=verified)](https://m8ven.ai/mcp/bitfloo/mailoo)\n\nMailoo is an open-source MCP server you run yourself to connect AI assistants and agents to multiple email accounts over IMAP and SMTP.\n\n- **Find what you need** — search and read email, threads, and attachments across accounts.\n- **Act on email** — prepare drafts, reply, and schedule messages through your assistant or agent.\n- **Choose your setup** — guided setup for Claude Desktop or Cursor, or a standard MCP connection for your own agent.\n\nMaintained by [Bitfloo](https://github.com/Bitfloo), forked from [email-mcp](https://github.com/codefuturist/email-mcp). Licensed under [LGPL-3.0-or-later](LICENSE); see [NOTICE](NOTICE) for attribution.\n\n## Quickstart for Claude Desktop or Cursor\n\nInstall [Node.js](https://nodejs.org/) **24 or newer** and [prepare your email account](docs/authentication.md) first, including an app password if your provider requires one. Then run these commands in a terminal:\n\n```bash\nnpx -y @bitfloo/mailoo@latest account add\nnpx -y @bitfloo/mailoo@latest config edit\nnpx -y @bitfloo/mailoo@latest install\n```\n\nIn `config edit`, press Enter to keep the rate limit (10 for a new config), then choose **Yes** for `Read-only mode? (disables all write operations)`. This saves read-only mode in TOML. Choose your client in the installer, restart it, and ask: **“Summarize up to five unread emails. Include each sender, subject and any requested next step. Ask which account to use if needed.”**\n\nThe wizard prints a read-only/core manual client entry; the installer does not apply those environment overrides. This guided path uses the read-only setting you saved in TOML. With untouched default settings, the installer's entry runs writable/full.\n\n[Follow the guided setup and check your first result →](docs/getting-started.md#quickstart-for-claude-desktop-or-cursor)\n\n## Quickstart for agent builders\n\nWith Node.js **24 or newer** and [account credentials ready](docs/authentication.md), create a local account using `npx -y @bitfloo/mailoo@latest account add`. Connect your MCP client over stdio:\n\n```json\n{\n  \"mcpServers\": {\n    \"mailoo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@bitfloo/mailoo@latest\", \"stdio\"],\n      \"env\": { \"MCP_EMAIL_READ_ONLY\": \"true\", \"MCP_EMAIL_TOOLSET\": \"core\" }\n    }\n  }\n}\n```\n\nInitialize the connection, list tools, then call `list_accounts`, `list_emails`, and `get_email` with the returned account name and message ID.\n\n[Follow the MCP request sequence and inspect its results →](docs/getting-started.md#quickstart-for-agent-builders)\n\nBoth quickstarts configure read-only access for the first read. The walkthrough also covers [feature requirements and fallbacks](docs/getting-started.md#feature-requirements-and-fallbacks), including AI triage, local calendars, ManageSieve, and experimental OAuth.\n\nTo enable writes later, run `config edit`, keep the rate limit, and choose **No** for read-only mode; for the builder entry, set `MCP_EMAIL_READ_ONLY` to `\"false\"`. Restart the server after either change. Request sending or changes explicitly when you intend them. You can request a `dryRun: true` preview separately; Mailoo does not require a preview before sending.\n\nMailoo connects to the mail servers you configure. Your MCP client and its model provider receive the mail content you request. Optional TypeSafe classification and webhooks send data to their configured services when enabled. Usage reporting is off by default. See [Capabilities & data flows](#capabilities--data-flows) for destinations and fields.\n\n## Highlights\n\nUp to 57 tools across `full`, `core`, and `minimal` profiles, up to 7 prompts, and 6 resources. Includes calendar and reminders, scheduling, ManageSieve filters, and optional AI triage. See [API](#api) for tools and [`docs/tools.md`](docs/tools.md) for behaviour and limits.\n\n| Feature | In this tree |\n|---------|:------------:|\n| Multi-account IMAP/SMTP | ✅ |\n| Send / reply / forward (with `dryRun` preview) | ✅ |\n| Drafts & templates | ✅ |\n| Provider-aware labels & bulk ops | ✅ |\n| Schedule future emails | ✅ |\n| Real-time IMAP IDLE watcher | ✅ |\n| AI triage with presets | ✅ |\n| Desktop & webhook alerts | ✅ |\n| Calendar (ICS, Apple Calendar/Reminders) | ✅ |\n| Email analytics | ✅ |\n| OAuth2 (Gmail / M365) | ✅ _experimental_ |\n| Guided setup wizard | ✅ |\n| ManageSieve (server-side filters) | ✅ |\n| Sender auth headers (SPF/DKIM/DMARC) | ✅ |\n| Toolset profiles (`full` / `core` / `minimal`) & GBNF small-LLM ergonomics | ✅ |\n| MCP `outputSchema` & `structuredContent` | ✅ |\n\n## Table of Contents\n\n- [Highlights](#highlights)\n- [Quickstart for Claude Desktop or Cursor](#quickstart-for-claude-desktop-or-cursor)\n- [Quickstart for agent builders](#quickstart-for-agent-builders)\n- [Security & Sandboxing Architecture](#security--sandboxing-architecture)\n- [LLM Ergonomics & Toolset Profiles](#llm-ergonomics--toolset-profiles)\n- [Docs](#docs)\n- [Background](#background)\n- [Install](#install)\n- [Usage](#usage)\n- [Capabilities & data flows](#capabilities--data-flows)\n- [API](#api)\n- [Maintainers](#maintainers)\n- [Contributing](#contributing)\n- [Attribution & License](#attribution--license)\n\n## Security & Sandboxing Architecture\n\nPolicy and how to report a vulnerability: **[SECURITY.md](SECURITY.md)**.\n\nMailoo applies controls to specific network, filesystem, and tool operations. It also labels untrusted mail for the model. Those labels do not guarantee how an LLM will respond to instructions inside an email.\n\n![Mailoo Architecture](docs/assets/mailoo-architecture.svg)\n\n**Enforced operation controls:**\n\n- **Zero Shell Execution (`execFile` only)** — Native OS integrations (macOS `osascript` for Calendar/Reminders/notifications, Linux `notify-send`, Windows `powershell`, and crontab installation) invoke `child_process.execFile` with argument arrays (`shell: false`), avoiding shell parsing of arguments.\n- **SSRF & DNS-Rebinding Protection (`net.BlockList`)** — Outbound alert webhooks validate URLs against an IPv4/IPv6 `net.BlockList` covering loopback, RFC 1918 private ranges, link-local/cloud metadata (`169.254.169.254`, `100.100.100.200`), CGNAT, NAT64, 6to4, and reserved prefixes both at configuration time and at socket connection time (`createWebhookConnectLookup`), preventing DNS-rebinding attacks (`src/safety/validation.ts`).\n- **Symlink-Free Write Containment (`savePath`)** — Attachment and `.eml` exports via `savePath` are strictly confined to the working directory, walk every path segment with `lstat`, refuse hidden dotfiles and OS persistence directories (`Library/LaunchAgents`, `.ssh`, `.gnupg`), and open targets with `O_CREAT | O_EXCL | O_NOFOLLOW` under a **50 MiB** cap (**5 MiB** inline base64 cap). An `.eml` export is capped by its own size; an attachment by its encoded size in the message, which for base64 runs above the file size ([details](docs/tools.md#download_attachment)).\n- **Strict Credential File Permissions (`0600`)** — `config.toml` is written and verified with mode `0600` inside a `0700` config directory (`$XDG_CONFIG_HOME/mailoo/config.toml`). Passwords and message bodies are redacted from the JSONL write audit log (`src/safety/audit.ts`).\n- **TLS & STARTTLS Verification** — `tls` enforces implicit TLS with certificate verification (`verify_ssl = true` by default); `starttls` fails closed if the server does not advertise `STARTTLS`. Turning both off is accepted only for a loopback host. ManageSieve refuses `AUTHENTICATE PLAIN` over unencrypted sockets without `STARTTLS`.\n- **Operational Guardrails (`MCP_EMAIL_READ_ONLY`, `MCP_EMAIL_TOOLSET`, `dryRun`)** —\n  - `MCP_EMAIL_READ_ONLY=true` disables all write tools, background watchers, hooks, and schedulers at startup, exposing only the 31 read-only tools.\n  - `MCP_EMAIL_TOOLSET=full|core|minimal` scopes the registered tool surface to match the agent's capability tier and context budget.\n  - `dryRun: true` on high-risk tools (`send_email`, `reply_email`, `forward_email`, `send_draft`, `delete_email`, `bulk_action`, `delete_mailbox`, `sieve_put_script`, `sieve_delete_script`) validates all parameters and account resolution and returns a `[DRY RUN]` preview without modifying server state.\n- **Per-Account Rate Limiting** — `rate_limit` (default 10 sends/minute) enforces an independent token bucket per account (`src/safety/rate-limiter.ts`). Buckets live in memory, so each server process and each `mailoo scheduler check` run counts on its own.\n\n**Untrusted-content labels:** Email subjects, sender headers, bodies, previews, and authentication results are wrapped in `<<<UNTRUSTED_EXTERNAL_CONTENT>>>` … `<<<END_UNTRUSTED_EXTERNAL_CONTENT>>>` delimiters. Mailoo strips forged copies of these markers from the payload before wrapping it. This fencing identifies external content as data for the receiving model; it is not a sandbox for model behaviour or a guarantee against prompt injection.\n\n## LLM Ergonomics & Toolset Profiles\n\nMailoo is designed to work across both frontier models (Claude, GPT, Gemini) and local/small 3B–8B parameter models (`llama.cpp` GBNF grammars, Ollama, vLLM):\n\n- **Toolset Profiles (`MCP_EMAIL_TOOLSET` / `settings.toolset`)**:\n  - `full` *(default)* — All **57 tools** (**31** in `read_only` mode), including Calendar, Reminders, ManageSieve, Watcher, Scheduler, Templates, Contacts, and Analytics.\n  - `core` — **19 tools** (**10** in `read_only` mode) covering core email workflows (`accounts`, `mailboxes`, `emails`, `threads`, `send`, `drafts`, `manage`, `bulk`, `attachments`, `health`).\n  - `minimal` — **14 tools** (**8** in `read_only` mode) tailored for 3B–4B models with tight context budgets (`accounts`, `mailboxes`, `emails`, `send`, `manage`, `health`).\n- **Optional `account` & Smart Account Resolution** — When only a single account is configured or `default_account` (`MCP_EMAIL_DEFAULT_ACCOUNT`) is set, the `account` parameter is completely optional across tools. Account lookup also matches case-insensitively by profile name or email address (e.g., passing `\"you@example.com\"` resolves the matching account), and returns actionable error messages listing valid accounts (`name (email)` pairs) when ambiguous.\n- **Lossless Parameter Normalization & GBNF Compatibility** — Single-message tools accept `emailId`, `id`, or `email_id` as either string or integer (`42` or `\"42\"`). Batch tools (`get_emails`, `bulk_action`) accept string or numeric ID arrays (`[\"42\", \"43\"]` or `[42, 43]`). `list_emails` and `search_emails` accept both `hasAttachment` and `has_attachment`. All Zod schemas avoid regex lookaheads so `llama.cpp` GBNF grammar compilation succeeds without errors.\n- **Context Window Protection** — `get_email` and `get_thread` default to `format=\"text\"` and enforce a default `maxLength` of `20000` characters (appending a clear truncation notice when exceeded) so large HTML newsletters never overflow small context windows.\n- **MCP `outputSchema` & `structuredContent`** — Tools declare structured `outputSchema` contracts and return machine-readable `structuredContent` alongside human-readable text blocks.\n- Outgoing attachment paths must be regular files under the working directory or home — [Security considerations](SECURITY.md#security-considerations)\n\n## Docs\n\n| Topic | Where |\n|-------|--------|\n| First account, Claude Desktop / Cursor, and an agent's first MCP calls | [docs/getting-started.md](docs/getting-started.md) |\n| IMAP credentials, Gmail / iCloud app passwords, and experimental Google / Microsoft OAuth | [docs/authentication.md](docs/authentication.md) |\n| Sent APPEND, IMAP4rev2, Sieve, `read_only`, reconnect backoff, stdio EOF, shutdown, one mailbox writer per machine | [docs/configuration.md](docs/configuration.md) |\n| `savePath`, search dates, `get_email_security`, sieve tools, send/draft attachments, RFC 2047, protected folders, busy-mailbox timeout, `bulk_action` ids, calendar attachment saves | [docs/tools.md](docs/tools.md) |\n| Performance notes | [docs/performance-roadmap.md](docs/performance-roadmap.md) |\n\n## Background\n\nMost MCP email implementations provide only basic read/send. This server aims to be a full-featured email client for AI assistants, covering the entire lifecycle: reading, composing, managing, scheduling, and analyzing email — all from a single MCP server.\n\nKey design decisions:\n\n- **XDG-compliant config** — TOML at `~/.config/mailoo/config.toml`\n- **Multi-account** — Operate across multiple IMAP/SMTP accounts simultaneously\n- **Layered services** — Business logic is decoupled from MCP wiring for testability\n- **Provider auto-detection** — Gmail, Outlook, Yahoo, iCloud, Fastmail, ProtonMail, Zoho, GMX\n\n## Install\n\nRequires [Node.js](https://nodejs.org/) ≥ 24.\n\nBefore opening the wizard, [prepare your provider credentials](docs/authentication.md). For a complete first run, choose the [Claude Desktop / Cursor](#quickstart-for-claude-desktop-or-cursor) or [agent builder](#quickstart-for-agent-builders) quickstart.\n\n```bash\nnpx -y @bitfloo/mailoo@latest account add\n```\n\nThat writes the local config and prints an MCP client snippet. The same package runs the server and the other commands:\n\n```bash\nnpx -y @bitfloo/mailoo@latest\nnpx -y @bitfloo/mailoo@latest test\n```\n\n`npx -y @bitfloo/mailoo@latest` with no subcommand starts the MCP server over stdio. Keep the `@latest` tag: npx then checks the registry on every start, while a bare package name runs any copy installed globally or in the current project, however old. Or install the `mailoo` command:\n\n```bash\nnpm install -g @bitfloo/mailoo\n# or\npnpm add -g @bitfloo/mailoo\n# or, without a global install:\npnpm dlx @bitfloo/mailoo account add\n```\n\n### From a clone\n\nBuilding this repository needs [pnpm](https://pnpm.io) 12 (the `packageManager` version in `package.json`):\n\n```bash\ngit clone https://github.com/Bitfloo/mailoo.git\ncd mailoo\npnpm install && pnpm build\nnode dist/main.js account add\n```\n\n### Docker\n\nThe running image needs Docker, not Node on the host. Create the config first with `npx -y @bitfloo/mailoo@latest account add` (or write the TOML by hand), then mount that directory into the container.\n\nThe image is `ghcr.io/bitfloo/mailoo`, built for linux/amd64 and linux/arm64. Version tags are bare semver (no `v` prefix); `latest`, `alpine` and the `-bookworm` / `-alpine` variants are published too. The `0.3` tag follows the newest 0.3.x release. Production setups should pin the full version from the release (it matches the npm version) or the image digest.\n\n```bash\ndocker pull ghcr.io/bitfloo/mailoo:0.3\n```\n\nTo build from a clone instead (`docker-compose.yml` uses `build: .`):\n\n```bash\ndocker build -t ghcr.io/bitfloo/mailoo .\n```\n\n> **Note:** The server uses stdio transport. Config is created on the host\n> (`npx -y @bitfloo/mailoo@latest account add`, or a hand-written TOML) and mounted into the container.\n\nInstalling or starting Mailoo does not send a usage report. An install count stays off until `MAILOO_INSTALL_COUNTER` is `1`, `true`, `on`, or `yes` (any letter case, surrounding spaces ignored) and `MAILOO_INSTALL_COUNTER_URL` is set. The POST body is only `product`, `version`, `event` (`install`), and `node_major`. Unset, `0`, `false`, `no`, or `off` keeps it off. Full rules: [Install count](#install-count).\n\n## Usage\n\nCommands below use `npx -y @bitfloo/mailoo@latest`. A global install accepts the same subcommands as `mailoo`. From a clone, after `pnpm build`, those subcommands are `node dist/main.js` (see [From a clone](#from-a-clone)).\n\n### Setup\n\n```bash\n# Add an email account interactively (recommended)\nnpx -y @bitfloo/mailoo@latest account add\n\n# Or use the deprecated alias (same wizard)\nnpx -y @bitfloo/mailoo@latest setup\n\n# Or create a template config manually\nnpx -y @bitfloo/mailoo@latest config init\n```\n\nThe setup wizard auto-detects server settings, tests connections, saves config, and outputs the MCP client config snippet.\n\n### Test Connections\n\n```bash\nnpx -y @bitfloo/mailoo@latest test            # all accounts\nnpx -y @bitfloo/mailoo@latest test personal   # specific account\n```\n\n`npx -y @bitfloo/mailoo@latest test` / `mailoo test` is a **live-account connection probe**, not Vitest. Unit and integration tests are `pnpm test` / `pnpm test:integration` (see [Contributing](#contributing)). OAuth2 accounts log in with an access token refreshed from the configured refresh token.\n\n### Configure Your MCP Client\n\nRun the guided installer for Claude Desktop, Cursor or Windsurf, or paste a snippet below for any client. Mailoo is published to the official MCP Registry as `io.github.Bitfloo/mailoo`.\n\n```bash\nnpx -y @bitfloo/mailoo@latest install\n```\n\nThe installer can register an `npx`, `pnpm dlx`, or global `mailoo` launch. A `mailoo` binary already on `PATH` can use `\"command\": \"mailoo\"` with `\"args\": [\"stdio\"]`.\n\n<details>\n<summary><strong>Claude Desktop</strong></summary>\n\nEdit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\\Claude\\claude_desktop_config.json` (Windows):\n\n```json\n{\n  \"mcpServers\": {\n    \"mailoo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@bitfloo/mailoo@latest\", \"stdio\"]\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><strong>Claude Code</strong></summary>\n\nRegister the server with the `claude` CLI. The default scope is the current project only. Put `--scope user` before the server name to make it available in every project, or `--scope project` to write a shareable `.mcp.json`; anything after the `--` is passed to the server, not to `claude`:\n\n```bash\nclaude mcp add mailoo -- npx -y @bitfloo/mailoo@latest stdio\n# or, available in every project:\nclaude mcp add --scope user mailoo -- npx -y @bitfloo/mailoo@latest stdio\n```\n</details>\n\n<details>\n<summary><strong>VS Code (GitHub Copilot)</strong></summary>\n\nMailoo is not in the VS Code Extensions gallery. Point Copilot at the `npx` launch below.\n\n**Workspace** (`.vscode/mcp.json`):\n\n```json\n{\n  \"servers\": {\n    \"mailoo\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@bitfloo/mailoo@latest\", \"stdio\"]\n    }\n  }\n}\n```\n\n**User config** (`settings.json`, all workspaces):\n\nOpen the Command Palette → **Preferences: Open User Settings (JSON)** and add:\n\n```json\n{\n  \"mcp\": {\n    \"servers\": {\n      \"mailoo\": {\n        \"type\": \"stdio\",\n        \"command\": \"npx\",\n        \"args\": [\"-y\", \"@bitfloo/mailoo@latest\", \"stdio\"]\n      }\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><strong>Cursor</strong></summary>\n\nEdit `~/.cursor/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"mailoo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@bitfloo/mailoo@latest\", \"stdio\"]\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><strong>Windsurf</strong></summary>\n\nEdit `~/.codeium/windsurf/mcp_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"mailoo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@bitfloo/mailoo@latest\", \"stdio\"]\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><strong>Zed</strong></summary>\n\nEdit `~/.config/zed/settings.json`:\n\n```json\n{\n  \"context_servers\": {\n    \"mailoo\": {\n      \"command\": {\n        \"path\": \"npx\",\n        \"args\": [\"-y\", \"@bitfloo/mailoo@latest\", \"stdio\"]\n      }\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><strong>Mistral Vibe</strong></summary>\n\nAdd to `~/.vibe/config.toml`:\n\n```toml\n[[mcp_servers]]\nname = \"mailoo\"\ntransport = \"stdio\"\ncommand = \"npx\"\nargs = [\"-y\", \"@bitfloo/mailoo@latest\", \"stdio\"]\n```\n\nTo pass credentials directly instead of using a config file, use the `env` field:\n\n```toml\n[[mcp_servers]]\nname = \"mailoo\"\ntransport = \"stdio\"\ncommand = \"npx\"\nargs = [\"-y\", \"@bitfloo/mailoo@latest\", \"stdio\"]\nenv = { MCP_EMAIL_ADDRESS = \"you@example.com\", MCP_EMAIL_PASSWORD = \"your-app-password\", MCP_EMAIL_IMAP_HOST = \"imap.example.com\", MCP_EMAIL_SMTP_HOST = \"smtp.example.com\" }\n```\n\nMCP tools are exposed as `mailoo_<tool_name>` (e.g. `mailoo_list_emails`). Restart Vibe after editing the config.\n\n</details>\n\n<details>\n<summary><strong>Docker (any MCP client)</strong></summary>\n\nRun the server in a container — mount your config directory read-only. The image is `ghcr.io/bitfloo/mailoo:0.3` (or build it with `docker build -t ghcr.io/bitfloo/mailoo .`):\n\n```bash\ndocker run --rm -i \\\n  -v ~/.config/mailoo:/home/node/.config/mailoo:ro \\\n  ghcr.io/bitfloo/mailoo:0.3\n```\n\nFor MCP client configuration (e.g. Claude Desktop):\n\nReplace `/absolute/path/to/mailoo-config` below with the **full absolute path** to the host directory containing `config.toml`. MCP clients spawn Docker directly: they do not expand `~` or shell variables in JSON arguments. The shell example above relies on shell expansion. On Windows with Docker Desktop, use a shared Windows host path such as `C:/absolute/path/to/mailoo-config` in this argument; do not copy the Unix path or shell line continuations.\n\n```json\n{\n  \"mcpServers\": {\n    \"mailoo\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\", \"--rm\", \"-i\",\n        \"-v\", \"/absolute/path/to/mailoo-config:/home/node/.config/mailoo:ro\",\n        \"ghcr.io/bitfloo/mailoo:0.3\"\n      ]\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><strong>Single-account via environment variables (no config file needed)</strong></summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"mailoo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@bitfloo/mailoo@latest\", \"stdio\"],\n      \"env\": {\n        \"MCP_EMAIL_ADDRESS\": \"you@example.com\",\n        \"MCP_EMAIL_PASSWORD\": \"your-app-password\",\n        \"MCP_EMAIL_IMAP_HOST\": \"imap.example.com\",\n        \"MCP_EMAIL_SMTP_HOST\": \"smtp.example.com\"\n      }\n    }\n  }\n}\n```\n</details>\n\n### CLI Commands\n\n```\nnpx -y @bitfloo/mailoo@latest [command]\n\nCommands:\n  stdio                     Run as MCP server over stdio (default)\n  http [port] [host]        Streamable HTTP (default: port 8080 on 127.0.0.1 and ::1)\n  account list              List all configured accounts\n  account add               Add a new email account interactively\n  account edit [name]       Edit an existing account\n  account delete [name]     Remove an account\n  setup                     Deprecated alias for 'account add'\n  test                      Test connections for all or a specific account\n  install                   Register mailoo with MCP clients interactively\n  install status            Show registration status for detected clients\n  install remove            Unregister mailoo from MCP clients\n  config show               Show config (passwords masked)\n  config edit               Edit global settings (rate limit, read-only)\n  config path               Print config file path\n  config init               Create template config\n  scheduler check           Process pending scheduled emails\n  scheduler list            Show all scheduled emails\n  scheduler install         Install OS-level scheduler (launchd/crontab)\n  scheduler uninstall       Remove OS-level scheduler\n  scheduler status          Show scheduler installation status\n  notify test               Send a test desktop notification\n  notify status             Check platform notification support\n  --version, -v             Print the package version\n  help                      Show help\n```\n\n### HTTP\n\n`http` listens on **127.0.0.1** and **::1** (port **8080** unless you pass another port). A non-loopback address or a non-loopback name in `MCP_EMAIL_HTTP_ALLOWED_HOSTS` requires `MCP_EMAIL_HTTP_TOKEN`. Details, including `0.0.0.0` / `::` and the 8 MiB body limit: [docs/configuration.md](docs/configuration.md#http-transport).\n\n```bash\nnpx -y @bitfloo/mailoo@latest http\nMCP_EMAIL_HTTP_TOKEN='replace-with-a-long-random-secret' npx -y @bitfloo/mailoo@latest http 8080 192.0.2.10\n```\n\nClients send `Authorization: Bearer <token>` when a token is configured.\n\n### Configuration\n\nLocated at `$XDG_CONFIG_HOME/mailoo/config.toml` (default: `~/.config/mailoo/config.toml`).\n\n```toml\n[settings]\nrate_limit = 10  # max emails per minute per account\nread_only = false\ntoolset = \"full\"  # \"full\" | \"core\" | \"minimal\"\ndefault_account = \"personal\"  # optional when only one account is configured\nsave_to_sent = true  # see docs/configuration.md — Gmail already files Sent\n\n[[accounts]]\nname = \"personal\"\nemail = \"you@example.com\"\nfull_name = \"Your Name\"\npassword = \"your-app-password\"\n\n[accounts.imap]\nhost = \"imap.example.com\"\nport = 993\ntls = true\n# disable_imap4rev2 = true  # Strato and similar SEARCH bugs\n# sieve_host = \"imap.example.com\"\n# sieve_port = 4190\n\n[accounts.smtp]\nhost = \"smtp.example.com\"\nport = 465\ntls = true\nstarttls = false\nverify_ssl = true\n\n[accounts.smtp.pool]\nenabled = true\nmax_connections = 1\nmax_messages = 100\n```\n\nAn IMAP or SMTP block with `tls = false` and `starttls = false`, in the file or from `MCP_EMAIL_*`, loads only for `localhost`, an address in `127.0.0.0/8` written in full (such as `127.0.0.1`), or `::1`; any other host is refused at config load.\n\n#### OAuth2 _(experimental)_\n\n> **Note:** OAuth2 support is experimental and requires your own provider application and initial refresh token. The account wizard does not perform browser authorization. Follow the [authentication guide](docs/authentication.md#experimental-oauth) for app registration, consent, token exchange, and connection checks.\n\nToken refresh and code exchange give up after 15 seconds, so a provider that stops answering fails the connect with `OAuth2 token refresh timed out after 15s` instead of hanging it. Callers that need a fresh token at the same time share one refresh request. The IDLE watcher logs in with the same access tokens.\n\n```toml\n[[accounts]]\nname = \"work\"\nemail = \"you@example.com\"\nfull_name = \"Your Name\"\n\n[accounts.oauth2]\nprovider = \"google\"            # or \"microsoft\"\nclient_id = \"your-client-id\"\nclient_secret = \"your-client-secret\"\nrefresh_token = \"your-refresh-token\"\n\n[accounts.imap]\nhost = \"imap.example.com\"\nport = 993\ntls = true\n\n[accounts.smtp]\nhost = \"smtp.example.com\"\nport = 465\ntls = true\n\n[accounts.smtp.pool]\nenabled = true\nmax_connections = 1\nmax_messages = 100\n```\n\n#### Environment Variables\n\nFor single-account setups (overrides config file):\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `MCP_EMAIL_ADDRESS` | *required* | Email address |\n| `MCP_EMAIL_PASSWORD` | *required* without OAuth2 | Password or app password. Not needed for an OAuth2 account (`MCP_EMAIL_OAUTH2_PROVIDER` set) |\n| `MCP_EMAIL_OAUTH2_PROVIDER` | — | `google`, `microsoft` or `custom`, read exactly as set; any other value is refused. Unset or empty means no OAuth2. An account in the environment replaces the config file, so `custom` set here fails at the first token request. Configure a `custom` account entirely in the config file, with `token_url` and `auth_url` under `[accounts.oauth2]` |\n| `MCP_EMAIL_OAUTH2_CLIENT_ID` | *required* with a provider | OAuth2 client id |\n| `MCP_EMAIL_OAUTH2_CLIENT_SECRET` | *required* with a provider | OAuth2 client secret |\n| `MCP_EMAIL_OAUTH2_REFRESH_TOKEN` | *required* with a provider | OAuth2 refresh token |\n| `MCP_EMAIL_IMAP_HOST` | *required* | IMAP server hostname |\n| `MCP_EMAIL_SMTP_HOST` | *required* | SMTP server hostname |\n| `MCP_EMAIL_ACCOUNT_NAME` | `default` | Account name |\n| `MCP_EMAIL_FULL_NAME` | — | Display name |\n| `MCP_EMAIL_USERNAME` | *email* | Login username |\n| `MCP_EMAIL_IMAP_PORT` | `993` | IMAP port |\n| `MCP_EMAIL_IMAP_TLS` | `true` | IMAP TLS |\n| `MCP_EMAIL_SMTP_PORT` | `465` | SMTP port |\n| `MCP_EMAIL_SMTP_TLS` | `true` | SMTP TLS |\n| `MCP_EMAIL_SMTP_STARTTLS` | `false` | SMTP STARTTLS |\n| `MCP_EMAIL_SMTP_VERIFY_SSL` | `true` | Verify SSL certificates |\n| `MCP_EMAIL_SMTP_POOL_ENABLED` | `true` | Enable SMTP transport pooling |\n| `MCP_EMAIL_SMTP_POOL_MAX_CONNECTIONS` | `1` | Max pooled SMTP connections |\n| `MCP_EMAIL_SMTP_POOL_MAX_MESSAGES` | `100` | Max messages per pooled connection |\n| `MCP_EMAIL_RATE_LIMIT` | `10` | Max sends per minute |\n| `MCP_EMAIL_READ_ONLY` | `false` | Disable all write tools, background watchers, and schedulers |\n| `MCP_EMAIL_TOOLSET` | `full` | Toolset profile to expose (`full`, `core`, or `minimal`) |\n| `MCP_EMAIL_DEFAULT_ACCOUNT` | — | Default account name or email when `account` is omitted |\n\nWithout the address, both hosts, and a password or a provider, the environment describes no account: Mailoo loads the config file instead, or fails with `No configuration found.` when there is none.\n\nSent copies, IMAP4rev2, Sieve host/port, and `read_only` env vars:\n[docs/configuration.md](docs/configuration.md#extra-environment-variables).\n\n### Email Scheduling\n\nThe scheduler enables future email delivery with a layered architecture:\n\n1. **MCP auto-check** — Processes the queue on server startup, before the watcher connects, and every 60 seconds while the MCP server is running. With several `stdio` servers, only the one that runs the watcher and hooks checks. A check still running when the next one is due is skipped, and failed sends are logged to the connected MCP client at `warning`\n2. **CLI** — `npx -y @bitfloo/mailoo@latest scheduler check` for manual or cron-based processing. It sends with the same account settings as the server, including OAuth2 and `save_to_sent`, and closes its IMAP/SMTP connections before it exits\n3. **OS-level daemon** — `npx -y @bitfloo/mailoo@latest scheduler install` sets up launchd (macOS) or crontab (Linux) to run every minute, independently of the MCP server\n\n> **Important — the daemon must be installed for reliable delivery.**\n> Without it, scheduled emails only fire while an AI client is actively connected.\n> Your machine also needs to be running at the scheduled time; if it's asleep or\n> off, the daemon will process overdue emails on next wake/startup. A failing send\n> is attempted up to **3 times** before the email is marked `failed`.\n\n#### Setting up the daemon\n\n```bash\n# Install (macOS launchd / Linux crontab — runs every minute)\nnpx -y @bitfloo/mailoo@latest scheduler install\n\n# Verify it's running\nnpx -y @bitfloo/mailoo@latest scheduler status\n\n# View pending / sent / failed scheduled emails\nnpx -y @bitfloo/mailoo@latest scheduler list\n\n# Trigger a manual check immediately\nnpx -y @bitfloo/mailoo@latest scheduler check\n\n# Remove the daemon\nnpx -y @bitfloo/mailoo@latest scheduler uninstall\n```\n\nScheduled emails are JSON files in `~/.local/state/mailoo/scheduled/`. Before sending, a check claims the entry with a lock file next to it and keeps that claim fresh while SMTP runs, so the in-process timer, `mailoo scheduler check` and other server processes do not send it twice. If the process dies after the server accepted a message but before it was recorded as sent, the entry can be sent again after the claim goes stale (at least once, not exactly once). Every attempt for one entry carries the same Message-ID, `<schedule id@account domain>`, so a receiving server or client can drop the second copy. Once SMTP has accepted a message, a failure to update the queue file is reported, and the entry is not sent again as long as either the sent record or the move into `sent/` succeeded. If both failed, the next check sends it again unless it has used all its attempts, then it is marked `failed`. Each entry tracks its attempts (at most 3) and the last error; `list_scheduled` returns both, and `scheduler list` shows the error of a failed entry. An entry the rate limit holds back stays pending for the next check and does not use an attempt.\n\n### Real-time Watcher & AI Hooks\n\nThe IMAP IDLE watcher monitors configured mailboxes in real-time using persistent IDLE connections (separate from tool connections). Each folder stays in IDLE between fetches, IDLE resumes about a second after each fetch, and `idle_timeout` sets how often IDLE is restarted. With several `stdio` servers on one machine (one per MCP client window), only one of them runs the watcher, hooks and scheduler; see [configuration](docs/configuration.md#one-mailbox-writer-per-machine). When new emails arrive:\n\n1. **Static rules** — Pattern-match on from/to/subject → apply labels, flag, or mark read instantly (no AI)\n2. **AI triage** — Remaining emails are analyzed via MCP sampling with a customizable preset prompt\n3. **Notify mode** — Falls back to logging if AI triage is disabled\n\nConfigure in `config.toml`:\n\n```toml\n[settings.watcher]\nenabled = true\nfolders = [\"INBOX\"]\nidle_timeout = 1740     # 29 minutes (IMAP spec max is 30)\n\n[settings.hooks]\non_new_email = \"triage\" # \"triage\" | \"notify\" | \"none\"\npreset = \"inbox-zero\"   # \"inbox-zero\" | \"gtd\" | \"priority-focus\" | \"notification-only\" | \"custom\"\nauto_label = true       # apply AI-suggested labels\nauto_flag = true        # flag urgent emails\nbatch_delay = 5         # seconds to batch before triage\n\n# User context — appended to preset's AI prompt\ncustom_instructions = \"\"\"\nI'm a software engineer. Emails from @example.com are always high priority.\nNewsletters I read: TL;DR, Hacker Newsletter.\n\"\"\"\n\n# Static rules — run BEFORE AI, skip AI if matched\n[[settings.hooks.rules]]\nname = \"GitHub Notifications\"\nmatch = { from = \"*@example.com\" }\nactions = { labels = [\"Dev\"], mark_read = true }\n\n[[settings.hooks.rules]]\nname = \"Newsletter Archive\"\nmatch = { from = \"*@example.com|*@example.test\" }\nactions = { labels = [\"Newsletter\"] }\n\n[[settings.hooks.rules]]\nname = \"VIP Contacts\"\nmatch = { from = \"ceo@example.com|cto@example.test\" }\nactions = { flag = true, labels = [\"VIP\"] }\n```\n\nBatches run one at a time. At most 500 new emails wait for the next batch; more\nare skipped with a warning in the log and stay in the mailbox unchanged.\n\n#### Presets\n\n| Preset | Focus | Suggested Labels |\n|--------|-------|------------------|\n| `inbox-zero` | Aggressive categorization + archiving | Newsletter, Notification, Updates, Finance, Social, Promo |\n| `gtd` | Getting Things Done contexts | @Action, @Waiting, @Reference, @Someday, @Delegated |\n| `priority-focus` | Simple priority classification (default) | _(none — just priority + flag)_ |\n| `notification-only` | No AI triage, just log | _(none)_ |\n| `custom` | User defines full system prompt | User-defined |\n\n#### Static Rules\n\nStatic rules use glob-style patterns (`*@example.com`) with `|` as OR separator (`*@example.com|*@example.test`). All conditions within a match are AND'd. A `to` pattern matches when any one recipient matches. An empty pattern counts as no condition, and a rule with no condition matches nothing. First matching rule wins.\n\nAvailable actions: `labels` (string array), `flag` (boolean), `mark_read` (boolean), `alert` (boolean — forces desktop notification).\n\n#### Alerts\n\nUrgency-based multi-channel notification routing — grab attention for important emails even when you're not looking at the chat. All channels are **opt-in** and disabled by default.\n\n| Priority | Desktop | Sound | MCP Log Level | Webhook |\n|----------|---------|-------|---------------|---------|\n| `urgent` | ✅ Banner | 🔊 Alert | `alert` | ✅ |\n| `high` | ✅ Banner | 🔇 Silent | `warning` | ✅ |\n| `normal` | ❌ | ❌ | `info` | ❌ |\n| `low` | ❌ | ❌ | `debug` | ❌ |\n\nThe MCP log entry at the listed level names the account, folder, UID, labels\nand rule. In alert entries, sender and subject appear only at `debug`: in a\nseparate entry, or for `low` in the single entry.\n\n```toml\n[settings.hooks.alerts]\ndesktop = true              # OS-level notifications (macOS/Linux/Windows)\nsound = true                # play sound for urgent emails\nurgency_threshold = \"high\"  # minimum priority to trigger desktop alert\nwebhook_url = \"https://ntfy.sh/my-email-alerts\"  # optional: Slack, Discord, ntfy.sh, etc.\nwebhook_events = [\"urgent\", \"high\"]\nallow_private_webhooks = false  # default; true allows a LAN, VPN, or tailnet target\n```\n\nDetails: [docs/configuration.md](docs/configuration.md#settingshooksalertsallow_private_webhooks).\n\n**Supported platforms:** macOS (Notification Center via `osascript`), Linux (`notify-send`), Windows (PowerShell toast). Zero npm dependencies — uses native OS commands.\n\n**Notification setup by platform:**\n\n<details>\n<summary>macOS</summary>\n\nDesktop notifications use `osascript` (built-in). The terminal app running the MCP server needs notification permission:\n\n1. Open **System Settings → Notifications & Focus**\n2. Find your terminal app (Terminal, iTerm2, VS Code, Cursor, etc.)\n3. Enable **Allow Notifications** and choose **Banners** or **Alerts**\n4. Ensure **Focus** / Do Not Disturb is not blocking notifications\n\nUse `check_notification_setup` to diagnose and `test_notification` to verify.\n</details>\n\n<details>\n<summary>Linux</summary>\n\nRequires `notify-send` from `libnotify`. For sound alerts, `paplay` is also needed:\n\n```bash\n# Ubuntu / Debian\nsudo apt install libnotify-bin pulseaudio-utils\n\n# Fedora\nsudo dnf install libnotify pulseaudio-utils\n\n# Arch\nsudo pacman -S libnotify\n```\n\nDesktop notifications require a running display server (X11/Wayland) — they will not work in headless/SSH sessions.\n</details>\n\n<details>\n<summary>Windows</summary>\n\nUses PowerShell toast notifications (built-in):\n\n1. Open **Settings → System → Notifications**\n2. Ensure **Notifications** is turned on\n3. Set **Focus Assist** to allow notifications\n4. If using Windows Terminal, ensure its notifications are enabled\n</details>\n\n**AI-configurable:** The AI can check, test, and configure notifications at runtime:\n- `check_notification_setup` — diagnose platform support and show setup instructions\n- `test_notification` — send a test notification to verify everything works\n- `configure_alerts` — enable/disable desktop, sound, threshold, webhook (with optional persist to config file)\n\n**Webhook payload:**\n```json\n{\n  \"event\": \"email.urgent\",\n  \"account\": \"work\",\n  \"sender\": { \"name\": \"John CEO\", \"address\": \"ceo@example.com\" },\n  \"subject\": \"Q4 Review Due Today\",\n  \"priority\": \"urgent\",\n  \"labels\": [\"VIP\"],\n  \"rule\": \"VIP Contacts\",\n  \"timestamp\": \"2026-02-18T11:30:00Z\"\n}\n```\n\nStatic rules can force desktop notifications with `alert = true`, regardless of urgency threshold:\n```toml\n[[settings.hooks.rules]]\nname = \"VIP Contacts\"\nmatch = { from = \"ceo@example.com\" }\nactions = { flag = true, alert = true, labels = [\"VIP\"] }\n```\n\nFeatures:\n- **Auto-reconnect** — Retries a dropped or failed folder connection on the [reconnect backoff](docs/configuration.md#reconnect-backoff) schedule; mail delivered while the connection was down is reported after the reconnect, unless the server changed the folder's UIDVALIDITY; a folder that has not connected yet reports only mail that arrives after its first successful connect\n- **Batching** — Groups arrivals within a configurable delay to reduce AI calls\n- **Rate limiting** — Max 10 sampling calls per minute\n- **Graceful degradation** — Falls back to notify mode if client doesn't support sampling\n\n### System One (opt-in typed filing)\n\nOptional TypeSafe System One classification on residue mail after static rules. **Off by default.** Both `settings.watcher.enabled` and `settings.system_one.enabled` must be on. Set `TYPESAFE_API_KEY` in the environment (never in TOML).\n\nOnly new mail in `source_folders` (default `INBOX`) that no static rule handled is classified. For each such message Mailoo sends one request to `api.typesafe.ai` (or `TYPESAFE_BASE_URL`). The request carries (`src/services/mail-arrival/state.ts`, `src/services/mail-arrival/questions.ts`):\n\n| Data | Sent |\n|---|---|\n| Sender | Display name and address from `From` |\n| Subject | The full subject |\n| Links | URLs found in the subject, and in the body when `include_body = true` |\n| Attachments | File name and MIME type of each attachment, not the file contents |\n| Sender authentication | SPF, DKIM (result and signing domain), and DMARC results; the From, Reply-To, and Return-Path domains; whether a `List-Unsubscribe` header is present |\n| Mailbox | The configured account name and the folder the message is in |\n| Folder rules | For each `[[settings.system_one.folders]]` entry: `path`, `description`, and `false_criteria`, or the other folder paths when `false_criteria` is unset |\n| Model | The `model` setting (default `jev-latest`) |\n| Body | Only with `include_body = true`: plain text without the quoted reply chain, cut to `body_max_chars` (default 6000, maximum 24000) |\n\nNot sent: To, Cc, and Bcc addresses, `Message-ID`, other raw headers, attachment contents, and the body while `include_body` is false.\n\nMailoo remembers the last 5000 messages it classified and does not send them again. A message that reaches two of your accounts is classified once in each. A message whose request, or whose header read, failed is not remembered, so the next notice of it tries again.\n\n`auto_move` and `auto_flag` are separate poles and default false. Filing destinations come from `folders[].path` (validated against IMAP LIST), not a live listing of every mailbox.\n\n```toml\n[settings.system_one]\nenabled = false\ninclude_body = false\nauto_move = false\nauto_flag = false\n\n[[settings.system_one.folders]]\npath = \"Receipts\"\ndescription = \"Invoices, receipts, and payment confirmations.\"\n```\n\n`on_new_email = \"notify\"` or `\"triage\"` both feed System One when it is on. `none` stays off.\n\n## Capabilities & data flows\n\nOutbound calls, child processes, files, and environment variables below are what `src/` does. Hook triage that uses MCP sampling stays inside the connected client; Mailoo does not dial a separate model host for that path.\n\n### Network\n\n| Destination | When | Code |\n|---|---|---|\n| Configured IMAP host and port | Reads, writes, IDLE | `src/connections/manager.ts`, `src/services/watcher.service.ts` |\n| Configured SMTP host and port | Sends | `src/connections/manager.ts` |\n| ManageSieve host (IMAP host if unset) port 4190 by default (`sieve_port` / `MCP_EMAIL_SIEVE_PORT`) | Filter scripts | `src/services/sieve.service.ts` |\n| `https://oauth2.googleapis.com/token` | Google token refresh and code exchange | `src/services/oauth.service.ts` |\n| `https://accounts.google.com/o/oauth2/v2/auth` | Authorization URL for the operator's browser; the process does not fetch it | `src/services/oauth.service.ts` |\n| `https://login.microsoftonline.com/common/oauth2/v2.0/token` | Microsoft token refresh and code exchange | `src/services/oauth.service.ts` |\n| `https://login.microsoftonline.com/common/oauth2/v2.0/authorize` | Authorization URL for the operator's browser; the process does not fetch it | `src/services/oauth.service.ts` |\n| Custom `token_url` / `auth_url` | Same split when `oauth2.provider` is `custom`. Config validation requires `https`; plain `http` is accepted only for `localhost`, `127.0.0.0/8`, or `::1` (`src/config/schema.ts`) | `src/services/oauth.service.ts` |\n| Configured webhook URL (`http` or `https` POST) | Alerts, after a DNS lookup of that host | `src/services/notifier.service.ts`, `src/safety/validation.ts` |\n| `https://api.typesafe.ai` (or `TYPESAFE_BASE_URL`) | System One classification, only when that integration is on. Fields sent: [System One](#system-one-opt-in-typed-filing) | `src/services/mail-arrival/index.ts` |\n| `MAILOO_INSTALL_COUNTER_URL` when `MAILOO_INSTALL_COUNTER` is on | One POST after the stdio or HTTP server starts. No request when either variable is unset. Fields: [Install count](#install-count) | `src/services/install-count.ts` |\n\n`mailoo http` listens. The install count below is the only outbound call that mode adds, and it runs only when that count is on and a URL is set. Provider presets in `src/cli/providers.ts` fill the IMAP and SMTP hosts the wizard saves.\n\n### Install count\n\nThe count is off. Nothing is sent at `npm install`, at `account add`, or when the server starts, until both of the following are set:\n\n- `MAILOO_INSTALL_COUNTER` is `1`, `true`, `on`, or `yes` (any letter case, surrounding spaces ignored)\n- `MAILOO_INSTALL_COUNTER_URL` is the collector URL\n\n`0`, `false`, `no`, `off`, or an unset `MAILOO_INSTALL_COUNTER` keeps the count off. An opted-in server with a blank URL does not call out. There is no built-in collector address.\n\nBitfloo runs a collector at `https://mailoo.bitfloo.com/install`. It keeps one count per UTC day, Mailoo version, and Node.js major, stores no IP address, and shows the total on [mailoo.bitfloo.com](https://mailoo.bitfloo.com). To be counted there:\n\n```sh\nMAILOO_INSTALL_COUNTER=1 MAILOO_INSTALL_COUNTER_URL=https://mailoo.bitfloo.com/install npx -y @bitfloo/mailoo@latest\n```\n\nOne `POST` runs after the `stdio` or `http` server has started. A later start does not send again. `account add`, `test`, the scheduler, and the other commands do not send. The count is skipped when `CI` is non-blank and not `0`, `false`, `no`, or `off` in any letter case, and when the process is a test run (`VITEST` non-blank, or `NODE_ENV=test`).\n\nThe body is a JSON object with exactly these fields:\n\n| Field | Value |\n|---|---|\n| `product` | `mailoo` |\n| `version` | the running package version |\n| `event` | `install` |\n| `node_major` | the Node.js major version, one integer |\n\nRequest headers are `content-type: application/json` and `user-agent: mailoo`. The request does not follow redirects. `http` is refused except for `localhost`, `127.0.0.0/8`, or `::1`. Any other URL must be `https`. A URL with a username, a password, a query, or a fragment is refused.\n\nThe body never includes an email address, account name, password, token, mail-server hostname, message id, folder name, or anything taken from a message. It also never includes a machine id, an operating-system username, a home directory, a working directory, or an IP address.\n\nBefore the request, the server creates `$XDG_STATE_HOME/mailoo/install-count` (mode `0600`) containing the digit `1` and nothing else, and sends only if it created that file. The file stays whatever the collector answers, so a state directory sends at most one request: two servers that start at once send one between them, and a refused, failed, or timed-out request is not retried. A state directory that cannot be written sends nothing. Delete the file to allow this state directory to count again.\n\n### Processes\n\n| Program | When | Code |\n|---|---|---|\n| `osascript` | macOS notifications, calendar events, reminders | `src/services/notifier.service.ts`, `src/services/osascript.ts` (calendar and reminders) |\n| `notify-send` | Linux desktop notifications | `src/services/notifier.service.ts` |\n| `paplay` | Linux notification sound | `src/services/notifier.service.ts` |\n| `powershell` | Windows balloon notifications | `src/services/notifier.service.ts` |\n| `which` (Windows: `where`) | Checks that `osascript`, `afplay`, `notify-send`, `paplay`, or `powershell` exists. `afplay` is only probed; macOS sound goes through `osascript` | `src/services/notifier.service.ts` |\n| `xdg-open` | Opens a temporary calendar file on Linux | `src/services/local-calendar.service.ts` |\n| `launchctl` | Installs, removes or checks (`scheduler status`) the macOS scheduler agent | `src/cli/scheduler.ts`, `src/cli/scheduler-install.ts` |\n| `crontab` | Installs, removes or checks (`scheduler status`) the Linux scheduler line | `src/cli/scheduler.ts`, `src/cli/scheduler-install.ts` |\n\n### Files\n\nPaths follow the XDG defaults in `src/config/xdg.ts` unless `XDG_CONFIG_HOME`, `XDG_DATA_HOME`, or `XDG_STATE_HOME` is set.\n\n| Path | What is written | Code |\n|---|---|---|\n| `$XDG_CONFIG_HOME/mailoo/config.toml` (mode `0600`) | Accounts and settings, including passwords and OAuth secrets | `src/config/loader.ts`; `configure_alerts` with `save` through `src/services/alerts-config.ts` |\n| `$XDG_DATA_HOME/mailoo/audit.log` | Append-only audit lines. File and directory modes: [SECURITY.md](SECURITY.md#security-considerations) | `src/safety/audit.ts` |\n| `$XDG_STATE_HOME/mailoo/scheduled/` and `scheduled/sent/` | Scheduled-send JSON records (mode `0600`), replaced through a temp file and rename | `src/services/scheduler.service.ts` |\n| `$XDG_DATA_HOME/mailoo/calendar-attachments/` | Attachment files saved for a calendar event | `src/services/imap.service.ts` |\n| `$XDG_STATE_HOME/mailoo/mailbox-writers.lock` | Which `stdio` server runs hooks, the watcher and the scheduler. The holder refreshes it and deletes it on shutdown; timings in [configuration](docs/configuration.md#one-mailbox-writer-per-machine) | `src/safety/writer-lease.ts` |\n| `$XDG_STATE_HOME/mailoo/install-count` (mode `0600`) | The digit `1`, written before the install count request and kept whatever the answer. No identity. Absent until an opted-in server first tries to count | `src/services/install-count.ts` |\n| `$XDG_STATE_HOME/mailoo/calendar-processed.json` (mode `0600`) and `.lock` | Which messages already had an automatic event added, found, or declined in the dialog, with each email's subject, replaced through a temp file and rename. A failed or timed-out add is not recorded, so the email stays eligible. A damaged file stops automatic calendar processing, and makes `analyze_email_for_scheduling` report an error, instead of starting over | `src/utils/calendar-state.ts` |\n| `savePath` under the working directory | `download_attachment` or `export_email` when that argument is set | `src/tools/attachments.tool.ts`, `src/tools/export.tool.ts` |\n| OS temp directory, `mailoo-event-*.ics` | Linux calendar file passed to `xdg-open` | `src/services/local-calendar.service.ts` |\n| `~/Library/LaunchAgents/com.bitfloo.mailoo.scheduler.plist` | macOS scheduler agent. Its stdout and stderr are `/tmp/mailoo-scheduler.log` | `src/cli/scheduler-install.ts`, `src/cli/scheduler.ts` |\n| User crontab | One Mailoo line on Linux | `src/cli/scheduler-install.ts` |\n| MCP client config (Claude, Cursor, Windsurf) | `mailoo install` merges the launch entry and replaces the file through a temp file and rename (mode `0600`). A file that is not a JSON object (for example JSON with comments) is left unchanged and the command stops | `src/cli/install-commands.ts`, `src/cli/client-config.ts` |\n\nTemplates under `$XDG_CONFIG_HOME/mailoo/templates/` are read, not written by the server.\n\n### Environment\n\nSingle-account setup reads `MCP_EMAIL_*` (`src/config/loader.ts`). The HTTP listener reads `MCP_EMAIL_HTTP_HOST`, `MCP_EMAIL_HTTP_TOKEN`, and `MCP_EMAIL_HTTP_ALLOWED_HOSTS` (`src/safety/http-transport.ts`). The same names are the Smithery config keys and the `packages[].environmentVariables` list in `server.json`.\n\n| Name | Role |\n|---|---|\n| `MCP_EMAIL_ADDRESS`, `MCP_EMAIL_PASSWORD`, `MCP_EMAIL_IMAP_HOST`, `MCP_EMAIL_SMTP_HOST` | Account. Password is required unless `MCP_EMAIL_OAUTH2_PROVIDER` is set |\n| `MCP_EMAIL_ACCOUNT_NAME`, `MCP_EMAIL_FULL_NAME`, `MCP_EMAIL_USERNAME` | Identity |\n| `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_PORT` | IMAP and ManageSieve |\n| `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_MESSAGES` | SMTP |\n| `MCP_EMAIL_OAUTH2_PROVIDER`, `MCP_EMAIL_OAUTH2_CLIENT_ID`, `MCP_EMAIL_OAUTH2_CLIENT_SECRET`, `MCP_EMAIL_OAUTH2_REFRESH_TOKEN` | OAuth2 |\n| `MCP_EMAIL_RATE_LIMIT`, `MCP_EMAIL_READ_ONLY`, `MCP_EMAIL_TOOLSET`, `MCP_EMAIL_DEFAULT_ACCOUNT`, `MCP_EMAIL_SAVE_TO_SENT` | Settings |\n| `MCP_EMAIL_WATCHER_ENABLED`, `MCP_EMAIL_WATCHER_FOLDERS`, `MCP_EMAIL_WATCHER_IDLE_TIMEOUT` | IDLE watcher |\n| `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` | Hooks |\n| `MCP_EMAIL_ALERT_DESKTOP`, `MCP_EMAIL_ALERT_SOUND`, `MCP_EMAIL_ALERT_URGENCY_THRESHOLD`, `MCP_EMAIL_ALERT_WEBHOOK_URL`, `MCP_EMAIL_ALERT_WEBHOOK_ALLOW_PRIVATE` | Alerts |\n| `MCP_EMAIL_HOOK_AUTO_CALENDAR`, `MCP_EMAIL_HOOK_CALENDAR_NAME`, `MCP_EMAIL_HOOK_CALENDAR_ALARM_MINUTES`, `MCP_EMAIL_HOOK_CALENDAR_CONFIRM` | Automatic calendar |\n| `MCP_EMAIL_SYSTEM_ONE_ENABLED` | System One switch. The API key is `TYPESAFE_API_KEY`, not a `MCP_EMAIL_*` variable |\n| `TYPESAFE_API_KEY`, `TYPESAFE_BASE_URL` | System One credential and optional API root. The SDK reads `TYPESAFE_BASE_URL` |\n| `XDG_CONFIG_HOME`, `XDG_DATA_HOME`, `XDG_STATE_HOME`, `APPDATA` | Override the directories above. `APPDATA` is the Windows Claude config directory used by `mailoo install` |\n| `MCP_EMAIL_HTTP_HOST`, `MCP_EMAIL_HTTP_TOKEN`, `MCP_EMAIL_HTTP_ALLOWED_HOSTS` | HTTP listen policy |\n| `MAILOO_INSTALL_COUNTER` | Install count switch. Unset is off. `1`, `true`, `on`, or `yes` opts in (any letter case, surrounding spaces ignored). `0`, `false`, `no`, or `off` forces it off. See [Install count](#install-count) |\n| `MAILOO_INSTALL_COUNTER_URL` | Collector URL for that count. Unset means no request, even when the switch is on |\n\n## API\n\n### Tools (57)\n\n#### Read (19)\n\n| Tool | Description |\n|------|-------------|\n| `list_accounts` | List all configured email accounts |\n| `list_mailboxes` | List folders with unread counts and special-use flags |\n| `list_emails` | Paginated email listing with date, sender, subject, and flag filters |\n| `get_email` | Read full email content with attachment metadata |\n| `get_emails` | Fetch full content of multiple emails in a single call (max 20) |\n| `get_email_status` | Get read/flag/label state of an email without fetching the body |\n| `search_emails` | Search by keyword; `since`/`before` (aliases `start_date`/`end_date`) |\n| `download_attachment` | Download an attachment (base64, or `savePath` to disk — not a read-only write) |\n| `export_email` | Export one message as its raw RFC 822 `.eml` source (base64, or `savePath` to disk); flags unchanged |\n| `find_email_folder` | Discover the real folder(s) an email resides in (resolves virtual folders) |\n| `extract_contacts` | Extract unique contacts from recent email headers |\n| `get_thread` | Reconstruct a conversation thread via References/In-Reply-To |\n| `list_templates` | List available email templates |\n| `get_email_stats` | Email analytics — volume, top senders, daily trends |\n| `check_health` | Connection health, latency, quota, and IMAP capabilities |\n| `get_email_security` | Read-only SPF/DKIM/DMARC and From/Reply-To/Return-Path domains |\n| `sieve_status` | Whether ManageSieve is reachable (default port 4190) |\n| `sieve_list_scripts` | List ManageSieve scripts |\n| `sieve_get_script` | Download a ManageSieve script |\n\n#### Write (12)\n\n| Tool | Description |\n|------|-------------|\n| `send_email` | Send a new email (plain text or HTML, CC/BCC, attachments) |\n| `reply_email` | Reply with proper threading (In-Reply-To, References) |\n| `forward_email` | Forward with original content quoted |\n| `save_draft` | Save a draft (RFC 2047 subjects; optional attachments) |\n| `send_draft` | Send an existing draft and remove from Drafts |\n| `apply_template` | Apply a template with variable substitution |\n| `schedule_email` | Schedule an email for future delivery |\n| `list_scheduled` | List scheduled emails by status |\n| `cancel_scheduled` | Cancel a pending scheduled email |\n| `sieve_put_script` | Create or replace a ManageSieve script (does not activate) |\n| `sieve_delete_script` | Delete a ManageSieve script |\n| `sieve_activate_script` | Activate a script (empty name deactivates all) |\n\n#### Manage (7)\n\n| Tool | Description |\n|------|-------------|\n| `move_email` | Move email between folders |\n| `delete_email` | Move to Trash or permanently delete |\n| `mark_email` | Mark as read/unread, flag/unflag |\n| `bulk_action` | Batch operation on up to 100 emails |\n| `create_mailbox` | Create a new mailbox folder |\n| `rename_mailbox` | Rename an existing mailbox folder (not INBOX or a special-use folder) |\n| `delete_mailbox` | Permanently delete a mailbox and contents (not INBOX or a special-use folder) |\n\n#### Labels (5)\n\n| Tool | Description |\n|------|-------------|\n| `list_labels` | Discover available labels (auto-detects provider strategy) |\n| `add_label` | Add a label to an email (ProtonMail folders, Gmail X-GM-LABELS, or IMAP keywords) |\n| `remove_label` | Remove a label from an email |\n| `create_label` | Create a new label |\n| `delete_label` | Delete a label (on Gmail, not INBOX or a special-use folder) |\n\n> **Note:** On servers that store labels as IMAP keywords, a keyword must be an IMAP atom\n> (RFC 9051): no spaces, control or non-ASCII characters, and none of `( ) { % * \" \\ ]`.\n> Any other label is refused with an error before anything is sent, so `Receipts (2024)`\n> fails (an older release accepted it). See [`add_label` / `remove_label`](docs/tools.md#add_label--remove_label)\n> for removing an existing non-atom keyword.\n\n#### Watcher & Alerts (6)\n\n| Tool | Description |\n|------|-------------|\n| `get_watcher_status` | Show IMAP IDLE connections, folders being monitored, and last-seen UIDs |\n| `list_presets` | List available AI triage presets with descriptions and suggested labels |\n| `get_hooks_config` | Show current hooks configuration — preset, rules, and custom instructions |\n| `configure_alerts` | Update alert/notification settings at runtime |\n| `check_notification_setup` | Diagnose desktop notification support and provide setup instructions |\n| `test_notification` | Send a test notification to verify OS permissions are configured |\n\n#### Calendar & Reminders (8)\n\n| Tool | Description |\n|------|-------------|\n| `extract_calendar` | Extract ICS/iCalendar events from an email |\n| `analyze_email_for_scheduling` | Analyze an email to detect events and reminder-worthy content |\n| `add_to_calendar` | Add an email event to the local calendar (macOS/Linux) |\n| `create_reminder` | Create a reminder in macOS Reminders.app from an email |\n| `list_calendars` | List all available local calendars |\n| `list_events` | List local calendar events with optional title, date, and calendar filters |\n| `list_reminders` | List Reminders.app items with optional title and list filters |\n| `check_calendar_permissions` | Check whether the local calendar is accessible |\n\nParameter-level notes for the tools above: [docs/tools.md](docs/tools.md).\n\n### Prompts (7)\n\nA prompt is listed only when the toolset registers the tools it calls: `summarize_thread` needs `core` or `full`, and `summarize_meetings` needs `full`. Where a send, draft, or bulk tool is missing (`minimal`, `read_only`), the prompt leaves that step out.\n\n| Prompt | Description |\n|--------|-------------|\n| `triage_inbox` | Categorize and prioritize unread emails with suggested actions |\n| `summarize_thread` | Summarize an email conversation thread |\n| `compose_reply` | Draft a context-aware reply to an email |\n| `draft_from_context` | Compose a new email from provided context and instructions |\n| `extract_action_items` | Extract actionable tasks from email threads |\n| `summarize_meetings` | Summarize upcoming calendar events from emails |\n| `cleanup_inbox` | Suggest emails to archive, delete, or unsubscribe from |\n\n### Resources (6)\n\n| Resource | URI | Description |\n|----------|-----|-------------|\n| Accounts | `email://accounts` | List of configured accounts |\n| Mailboxes | `email://{account}/mailboxes` | Folder tree for an account |\n| Unread | `email://{account}/unread` | Unread email summary |\n| Templates | `email://templates` | Available email templates |\n| Stats | `email://{account}/stats` | Email statistics snapshot |\n| Scheduled | `email://scheduled` | Pending scheduled emails |\n\n### Provider Auto-Detection\n\n| Provider | Domains |\n|----------|---------|\n| Gmail | gmail.com |\n| Outlook / Hotmail | outlook.com, hotmail.com, live.com |\n| Yahoo Mail | yahoo.com, ymail.com |\n| iCloud | icloud.com, me.com, mac.com |\n| Fastmail | fastmail.com |\n| ProtonMail Bridge | proton.me, protonmail.com |\n| Zoho Mail | zoho.com |\n| GMX | gmx.com, gmx.de, gmx.net |\n\n### Architecture\n\n```\nsrc/\n├── main.ts                — Entry point and subcommand routing\n├── server.ts              — MCP server factory\n├── logging.ts             — MCP protocol logging bridge\n├── cli/                   — Interactive CLI commands\n│   ├── account-commands.ts — Account CRUD (list, add, edit, delete)\n│   ├── setup.ts           — Legacy setup alias → account add\n│   ├── test.ts            — Connection tester\n│   ├── config-commands.ts — Config management (show, edit, path, init)\n│   ├── install-commands.ts — MCP client registration (install, status, remove)\n│   ├── providers.ts       — Provider auto-detection (IMAP/SMTP presets)\n│   └── scheduler.ts       — Scheduler CLI\n├── config/                — Configuration layer\n│   ├── xdg.ts             — XDG Base Directory paths\n│   ├── schema.ts          — Zod validation schemas\n│   └── loader.ts          — Config loader (TOML + env vars)\n├── connections/\n│   ├── auth.ts            — IMAP/SMTP credentials (password or OAuth2)\n│   ├── backoff.ts         — Reconnect delays with jitter after a failed connect\n│   ├── manager.ts         — Lazy persistent IMAP/SMTP with OAuth2 (experimental)\n│   └── probe.ts           — One-shot IMAP/SMTP login checks (setup wizard, mailoo test)\n├── services/              — Business logic\n│   ├── imap.service.ts    — IMAP operations\n│   ├── label-strategy.ts  — Provider-aware label strategy (ProtonMail/Gmail/IMAP keywords)\n│   ├── smtp.service.ts    — SMTP operations + optional \\\\Sent APPEND\n│   ├── sieve.service.ts   — ManageSieve (RFC 5804)\n│   ├── template.service.ts — Email template engine\n│   ├── oauth.service.ts   — OAuth2 token management (experimental)\n│   ├── mail-services.ts   — IMAP/SMTP services from the config, for the servers and the scheduler CLI\n│   ├── calendar.service.ts — ICS/iCalendar parsing\n│   ├── scheduler.service.ts — Email scheduling queue\n│   ├── watcher.service.ts — IMAP IDLE real-time watcher with auto-reconnect\n│   ├── hooks.service.ts   — AI triage via MCP sampling + static rules + auto-labeling/flagging\n│   ├── notifier.service.ts — Multi-channel notification dispatcher (desktop/sound/webhook)\n│   ├── presets.ts         — Built-in hook presets (inbox-zero, gtd, priority-focus, etc.)\n│   └── event-bus.ts       — Typed EventEmitter for internal email events\n├── tools/                 — MCP tool definitions (57)\n├── prompts/               — MCP prompt definitions (7)\n├── resources/             — MCP resource definitions (6)\n├── safety/                — Audit trail, rate limiter, stdio lifecycle, shutdown, writer lease\n│   └── http-transport.ts  — Streamable HTTP listen policy\n├── utils/                 — RFC 2047 compose, MIME body, auth headers\n└── types/                 — Shared TypeScript types\n```\n\n## Maintainers\n\n[Bitfloo](https://github.com/bitfloo)\n\n## Contributing\n\nPRs accepted against **`develop`** (GitHub default). `develop` is the release\nline; releases are tagged `v*` from it. Please conform to the\n[standard-readme](https://github.com/RichardLitt/standard-readme) specification\nwhen editing this README. See [CONTRIBUTING.md](CONTRIBUTING.md).\n\n```bash\n# Development workflow\npnpm install\npnpm typecheck          # type check\npnpm check              # lint and format\npnpm ci:local           # lint, typecheck, unit; GreenMail if Docker is up\npnpm ci:release         # same checks; a working Docker runtime and GreenMail are required\npnpm test               # unit tests (Vitest; no mail server)\npnpm test:integration   # GreenMail IMAP/SMTP (needs Docker)\npnpm test:e2e           # packed release, production dependencies, stdio MCP, GreenMail\npnpm test:all           # unit plus GreenMail\npnpm build              # build\npnpm start              # run\n```\n\n`pnpm test:integration`, `pnpm test:e2e`, `pnpm test:all`, and `pnpm ci:release` need Docker. The packed release journey is also included in the integration suite. `pnpm ci:local` skips GreenMail when Docker is down; `pnpm ci:release` fails instead. Publishing to npm, the MCP Registry, and npm aliases requires the release verification job to pass; Docker publishing also requires the MCP Registry job to succeed. What GitHub runs on a pull request is listed in [CONTRIBUTING.md](CONTRIBUTING.md#commands). `mailoo test` / `npx -y @bitfloo/mailoo@latest test` is a live-account connection probe, not Vitest.\n\n## Attribution & License\n\nThis is a public **LGPL-3.0-or-later fork** of [email-mcp](https://github.com/codefuturist/email-mcp) by\n[codefuturist](https://github.com/codefuturist). It is **not** an official\ncodefuturist project. Original copyright remains with the original authors.\nMailoo branding, Bitfloo trademarks, and new code are Copyright (c) 2026 Bitfloo.\n\nLicensed under [LGPL-3.0-or-later](LICENSE). The GNU GPL-3 text required by LGPL-3 is in [COPYING](COPYING).\nAttribution is recorded in [NOTICE](NOTICE).\n","readmeFilename":"README.md"}