Outlook Assistant v3.7.3 — E2E Sweep: 25 Real-World Fixes
Outlook Assistant v3.7.3 lands a comprehensive E2E sweep against a live personal Outlook.com mailbox: MCP boundary param coercion, strict unknown-param rejection, file outputDir, ID surfacing, and 20+ targeted bug fixes.
Highlights
Single chokepoint for MCP param coercion
most MCP clients deliver array, boolean, integer, and number params as JSON-encoded strings. v3.7.3 walks each tool's inputSchema once at the dispatch boundary and coerces values into the right JS type. No more 'manage-rules isEnabled silently ignored' or 'update-email ids iterates char-by-char'.
Strict unknown-param rejection
every tool now sets additionalProperties: false at the MCP boundary. typo a param name (verbosity on folders list) and you get an explicit error listing valid params, not silent-ignore. param-name aliases added so canonical and legacy names both work.
File output: outputDir honoured everywhere
attachments download, export target=message, export target=conversation all now respect outputDir. Defaults to os.tmpdir() instead of cwd. Auto-creates the target directory. Deprecated savePath alias kept for back-compat.
Diagnostics that actually diagnose
auth action=about now shows displayName <email> at the top of the block. folders create and manage-rules create return the new ID inline (was missing before). manage-event accept properly documents itself as unsupported on personal Outlook.com instead of failing silently.
What’s new in v3.7.3
This release is the result of a manual end-to-end sweep against a live personal Outlook.com mailbox — every tool, every action permutation, every reasonable param shape. 48 findings filed across 7 GitHub issues (#159 tracker, #160-#165 by theme); 25+ fixes shipped here. v3.7.4 picks up two more (#168, #169) that surfaced in re-verification.
I’ll spare the line-by-line — see the CHANGELOG for the full list. The highlights:
MCP boundary chokepoint
Every MCP client delivers params slightly differently. Some send arrays as JSON strings; some send booleans as "true" / "false"; some send numbers as decimal-formatted strings. Pre-3.7.3, each tool handler tried to deal with this individually, and the work was inconsistent. The visible failures were random: manage-rules isEnabled was silently ignored, update-email ids iterated character-by-character (one call → 400+ Graph errors), apply-category categories array literally didn’t work via MCP at all.
utils/schema-coerce.js handles it now. Single function, walks the tool’s inputSchema, coerces each value, hands the handler real JS types. 36 unit + integration tests covering each coercion path. Add a tool, no extra coercion code needed.
Strict unknown-param rejection
Same idea — additionalProperties: false on every tool’s input schema. Typo a param and you get “Unknown param ‘verbosit’. Valid params: format, count, …” instead of silently ignoring it. Param-name aliases let backwards-compatible names continue to work (manage-event takes id or eventId; manage-rules takes displayName to match Graph’s field name; manage-category takes deprecated set and categoryId; etc.).
File output everywhere
attachments download outputDir, export target=message outputDir, export target=conversation outputDir — all now honour the param. Default to os.tmpdir() rather than the current working directory (which was rarely what callers wanted). Auto-create the target directory if it doesn’t exist. Kept the deprecated savePath alias.
IDs on creates
folders create and manage-rules create previously didn’t surface the new resource’s ID. The agent had to list, find by name, hope the name was unique. v3.7.3 adds **ID**: <id> to the response and surfaces it in _meta.
Identity in auth about
Before: token diagnostics, scopes, expiry, last refresh — no indication of which mailbox. After: displayName <email> at the top of the block via a single GET /me. Surprisingly hard to live without once you have it.
Safety-belt warnings
OUTLOOK_MAX_EMAILS_PER_SESSION and OUTLOOK_ALLOWED_RECIPIENTS are off by default — sensible for tool authors but error-prone if you forget to set them and start sending real email. Server startup now warns when they’re unset and prints a copy-paste snippet. Ships a .mcp.json.example with both pre-wired.
Other notable fixes
read-emailstrips zero-width tracking-pixel chars (U+200B..U+200F, U+2060, U+FEFF) — was bloating tokens by hundreds of chars on Gmail-relayed messages.set-auto-replies enabled=falseproperly transitionsscheduled→disabled(was previously a silent no-op).set-auto-replies enabled=true(no schedule) on personal accounts now warns when Graph silently coerces the request todisabled.manage-contact listuses$count: trueand shows “Showing N of M” with askip: Nhint when more pages exist.find-meeting-roomsandget-mail-tipsdistinguish “feature not available on this account type” from generic permission errors.
This is the largest single release of fixes Outlook Assistant has had. The mailbox sweep was 12 hours of pure regression-finding and the resulting 25-ish fixes are a significant trust upgrade — the small things that used to surprise you no longer surprise you.
This update is for
Outlook Assistant — view full product page