# Reported issues for outlook-mcp

Pod holds 18 of 94 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.

Back to [outlook-mcp](/mcp/outlook-mcp).

## Most discussed

### v3.7.2 E2E test sweep — 48 findings across all 22 tools

## Summary

Manual E2E sweep of every tool/action permutation in v3.7.2 against a live **Personal Outlook.com** account, run on 2026-05-05.

- **Tools touched:** 22 / 22
- **Findings:** 48 (F-1 through F-48)
- **Account type:** Personal Outlook.com (M365-only features marked skipped)
- **Write safety:** Self-only sends + cleanup; sentinel naming (`e2e-test-2026-05-05`, `[E2E v3.7.2]`)
- **Cleanup status:** ✅ All sentinels removed, mailbox state restored

### Severity histogram

| Severity | Coun

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/159) · 2026-05-05 · closed · 5 comments

### search-emails: searchAllFolders=true silently drops kqlQuery and returns wrong results

## Summary

The `search-emails` tool's `searchAllFolders=true` branch is unreliable in two ways:

1. **`kqlQuery` is silently ignored.** A KQL filter that should narrow results is dropped; the call returns a chronological dump of recent inbox messages with `_Search strategy: combined-search_` (a strategy line that lies about what was applied).
2. **`query` returns zero where without `searchAllFolders` it returns matches.** The cross-folder branch sometimes finds strictly fewer results than the i

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/169) · 2026-05-05 · open · 3 comments

### Add JSDoc comments to exported functions in `utils/graph-api.js`

The `utils/graph-api.js` module is the core Graph API client used by every tool module, but its exported functions lack JSDoc documentation.

**What to do:**
- Add `@param` and `@returns` JSDoc comments to all exported functions in `utils/graph-api.js`
- Include brief descriptions of what each function does
- Document any important side effects (e.g., automatic token refresh)

**Why this matters:**
- Helps contributors understand the API surface without reading the full implementation
- Enables 

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/70) · 2026-03-09 · closed · 3 comments

### v3.7.3 regression: F-24 fix incomplete — chokepoint misses JSON-stringified arrays from MCP transport

## Summary

The post-tag commit `9b4373a` ("fix(coerce): close v3.7.3 verification gaps (F-17, F-24)") claims to fix F-24 (array literals in string-typed params like `to`/`cc`/`bcc`), but the fix only catches the case where the value arrives as a real JS array. In practice, MCP clients (Claude Code's MCP harness, at minimum) JSON-stringify the array literal before transmission when the schema declares `type: "string"`, so the chokepoint receives a string like `'["nathanschram@live.com"]'` (liter

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/168) · 2026-05-05 · closed · 2 comments

### Theme: tool outputs omit useful context (IDs, pagination, identity)

**Tracking issue:** #159
**Severity:** inefficiency
**Theme:** Tools return human-readable output but skip details that callers (especially AI agents) need to drive subsequent operations

## The pattern

A common failure mode: tool A creates a thing, tool B operates on it. If A doesn't return the ID, the caller has to make an extra \`list\` call (with potential ambiguity if names aren't unique). Or: a list returns 50 items with no pagination indicator, leaving the caller unsure whether more exis

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/165) · 2026-05-05 · closed · 2 comments

### Theme: param-shape mismatches — array/boolean/string schema-vs-handler drift

**Tracking issue:** #159
**Severity:** blocker (multiple sub-findings)
**Theme:** Param shape mismatches across the entire tool surface

## The pattern

Schema declares one type, handler reads another. Common variants:
- Schema says \`type: 'array'\` → MCP delivers a JSON-stringified array → handler iterates over the *characters*.
- Schema says \`type: 'boolean'\` → MCP delivers a string → handler does \`=== true\` and gets \`false\`.
- Schema says \`type: 'string'\` ("comma-separated") → caller

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/160) · 2026-05-05 · closed · 2 comments

### feat: publisher-verified shared multi-tenant app (one-click setup for read-only)

## Summary

Register a **publisher-verified** shared multi-tenant Azure app owned by Little Bear Apps so end users can connect Outlook Assistant without each creating their own Azure app. The shared app is **read-only by design**; users who need write scopes (`Mail.Send`, `Mail.ReadWrite`, etc.) continue to use BYO mode via `OUTLOOK_CLIENT_ID` override.

One app covers **both Microsoft 365 work/school accounts and personal Microsoft accounts** (outlook.com, hotmail.com, live.com) via `signInAudi

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/147) · 2026-04-20 · open · 2 comments

### feat: add draft email tool (create, update, send, delete, reply, forward)

## Summary

Add a consolidated `draft` tool to manage email drafts via the Microsoft Graph API. Follows the existing action-based routing pattern used by `update-email`, `folders`, `manage-rules`, etc.

## Actions

| Action | Graph API | Description |
|--------|-----------|-------------|
| `create` | `POST me/messages` | Create new draft in Drafts folder |
| `update` | `PATCH me/messages/{id}` | Update existing draft (subject, body, recipients, importance) |
| `send` | `POST me/messages/{id}/sen

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/110) · 2026-03-29 · closed · 2 comments

## Most recent

### docs: folders delete is recoverable (moves to Deleted Items), not "no recycle-bin recovery"

## Summary

The `folders` tool's `delete` action is described as permanent:

> action=`delete` permanently removes a folder (by `folderName`/path or `folderId`) and its contents — **there is no recycle-bin recovery**.

But on **personal Outlook.com**, deleting a mail folder actually **moves it (and its contents) to Deleted Items**, where it is recoverable — it is *not* an unrecoverable hard delete.

Observed during the v3.9.0 live E2E sweep: after `folders delete folderName="e2e-v390-parent"`, t

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/218) · 2026-07-22 · open · 0 comments

### docs: raw searchExpression field-scoped $search returns 0 on personal Outlook.com

## Summary

On **personal Outlook.com** accounts, a raw `searchExpression` (formerly `kqlQuery`) using field-scoped `$search` syntax — e.g. `subject:"LinkedIn"`, `from:github.com` — often returns **0 results**, even when matching messages clearly exist. The raw-`$search` branch intentionally does **not** fall back to the OData/client-side ladder (that's the #169 V37-F-1 fix that stopped it silently dropping the filter), so the user just sees "No emails found".

Surfaced during the v3.9.0 live E2

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/217) · 2026-07-22 · open · 0 comments

### feat: nested folder addressing (path syntax + folder IDs) for folders tool

## Summary

The `folders` tool cannot address any **non-top-level (nested) folder** for `move`, `stats`, or `delete`. On work/school (Entra ID) accounts — where deep folder trees are the norm — this makes large parts of the mailbox unreachable.

Reported by @boz-tech on #159 (v3.8.1, Claude Desktop / Windows, work-school Entra ID account). Splitting into its own issue because #159 is the (now closed) v3.7.2 personal-account E2E sweep tracker; this is a distinct cross-cutting capability gap.

## 

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/216) · 2026-07-22 · closed · 0 comments

### Security Audit: bump @modelcontextprotocol/sdk to clear transitive hono (high) + body-parser (low) advisories

## Context

The required `Security Audit` CI gate (`npm audit --omit=dev --audit-level=high`) fails on `main` due to **pre-existing, transitive** advisories, not any first-party code:

- **`hono` (high)** — via `@modelcontextprotocol/sdk` → `@hono/node-server` → `hono@4.12.7`. Advisories: serve-static path traversal on Windows (GHSA-wwfh-h76j-fc44), CORS wildcard-with-credentials (GHSA-88fw-hqm2-52qc), Lambda adapter cookie/header issues, body-limit bypass. All are **HTTP-server** issues; this s

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/215) · 2026-07-21 · open · 0 comments

### Device-code auth returns empty output on failure (reported via LinkedIn)

## Report

A user ("Ben", Windows 11, Claude **Cowork** remote-connector session) reported that:

- `auth { action: "authenticate", method: "device-code" }` "completes successfully but returns **empty output**" — no device code, no verification URL.
- Follow-up `auth { action: "status" }` still shows "Not authenticated."

## Root cause

`handleDeviceCodeAuth()` called `initiateDeviceCodeFlow()` with **no try/catch**. When the HTTPS request to Microsoft throws (blocked outbound egress in a sandbo

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/213) · 2026-07-21 · closed · 0 comments

### docs: add docs/faq/index.md for help-centre FAQPage schema

## Context

The littlebearapps.com help centre now emits Schema.org `FAQPage`
JSON-LD on any help article whose `category: faq` frontmatter is set,
*or* whose body contains ≥3 question-shaped H2s. The category exists in
the help collection schema, but **no tool currently has a dedicated
FAQ article** — synced or hand-written. This issue tracks creating
that scaffold for **Outlook Assistant**.

The marketing-site infrastructure (FAQPage extractor, author byline,
heading anchors, per-tool `llms.tx

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/167) · 2026-05-05 · open · 1 comment

### Theme: README promises features that aren't fully delivered

**Tracking issue:** #159
**Severity:** docs (credibility) / bug
**Theme:** README and tools-reference advertise features that are partial, broken, or missing

## The pattern

The README leans hard on differentiator claims (\"most Graph API wrappers fail silently; this one adapts\", \"forensic analysis built in as a first-class feature\", \"send-email protections\", etc.). The E2E sweep found several of these are aspirational or partial.

## Findings under this theme

### 🚨 F-12 — Progressive sea

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/164) · 2026-05-05 · closed · 1 comment

### Theme: schema-vs-docs param-name drift across tools

**Tracking issue:** #159
**Severity:** docs / inefficiency
**Theme:** Param names are inconsistent across tools and not always discoverable

## The pattern

Each tool was built with its own naming conventions. There's no shared vocabulary for:
- The **identifier** of the thing being managed (\`id\` vs \`eventId\` vs \`ruleId\` vs \`categoryId\` vs \`sharedMailbox\`)
- The **display name** (\`name\` vs \`displayName\`)
- The **email** of a contact / shared mailbox (\`email\` vs \`emails\` vs \`sh

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/163) · 2026-05-05 · closed · 1 comment

### Theme: invalid actions silently fall through to default handler

**Tracking issue:** #159
**Severity:** bug (UX + correctness)
**Theme:** Multi-action tools' switch statements default to \`get\`/\`list\` for unknown actions

## The pattern

Every multi-action tool has:

\`\`\`js
switch (action) {
  case 'create': return handleCreate(args);
  case 'update': return handleUpdate(args);
  case 'delete': return handleDelete(args);
  case 'get':
  default:       return handleGet(args);    // ← swallows typos
}
\`\`\`

Calling \`mailbox-settings action=set-auto-repl

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/162) · 2026-05-05 · closed · 1 comment

### Theme: PATCH-then-format silent failures across mutating tools

**Tracking issue:** #159
**Severity:** bug (data integrity)
**Theme:** Tool reports \"updated!\" but Graph state didn't change

## The pattern

Multiple tools follow this template:
1. Read current state (GET).
2. Build a partial settings object.
3. PATCH it to Graph.
4. GET fresh state.
5. Format and return: \"X updated!\\n\\n{formatted state}\".

When step 3's PATCH is silently rejected by Graph (or the partial object has no effect), step 5 still returns \"updated!\" — but the formatted state s

[Read the thread](https://github.com/littlebearapps/outlook-assistant/issues/161) · 2026-05-05 · closed · 1 comment

The remaining reports are on [the project's issue tracker](https://github.com/littlebearapps/outlook-mcp/issues).
