Skip to main content
Glama
mpalermiti

outlook-mcp

by mpalermiti

outlook-mcp

MCP server for Microsoft Outlook personal accounts via Microsoft Graph API.

PyPI Python License: MIT MCP Registry

Personal Microsoft accounts only — @outlook.com, @hotmail.com, @live.com. Work/school accounts (Entra ID) are not supported in v1.

Disclaimer: Independent open-source project. Not affiliated with, endorsed by, or supported by Microsoft Corporation. "Outlook" and "Microsoft Graph" are trademarks of Microsoft.


Who this is for

You'll like this if you're:

  • An agent builder wiring Outlook into your own infra (OpenClaw, Claude Code, Cursor, custom MCP host) and want a typed tool surface — not stdout you have to parse

  • Building on personal Microsoft accounts (Outlook.com / Hotmail / Live) and want full control: BYO Azure app, no enterprise consent flow, no shared client ID

  • Looking for real coverage — mail, calendar, contacts, to-do, drafts, folders, batch ops, threading — instead of a mail-only or calendar-only wrapper

  • Security-conscious: tokens in the OS keyring (Keychain on macOS, libsecret on Linux -- never cleartext unless you opt in), granular allow_categories, optional read_only mode, zero telemetry

This isn't for you if you need work/school M365 accounts (use Microsoft's official tooling — Entra ID auth and admin-consent flows are out of scope here), or if a basic mail-only client would suffice (this has 68 tools — way more than you need for "read my inbox").

How it differs from other Outlook tools you'll find

This is the only first-class MCP server in the personal-Outlook space — most alternatives are bash scripts or skill-shaped CLI wrappers the agent shells out to. That distinction matters: the agent gets typed tool schemas with structured args/returns, not stdout it has to parse. Other things you won't find elsewhere: /$batch-optimized triage (10-20× faster on bulk ops), recursive folder ops with name resolution, granular per-category permissions, multiple mailboxes (one server per account via OUTLOOK_MCP_CONFIG_DIR), and full attachment write paths including >3MB upload sessions for drafts.


Related MCP server: mega-outlook-mcp

What This Enables

Give your AI agent full Outlook access. Example prompts that just work:

  • "Summarize my unread email from the past 24 hours and flag anything time-sensitive."

  • "What's in my Focused Inbox right now? Anything in Other that looks like it belongs up top?"

  • "Any shipping updates in my inbox? Track what I'm waiting on and when it's supposed to arrive."

  • "Scan my email for upcoming subscription renewals — what's about to auto-charge in the next two weeks?"

  • "I've got a trip to Seattle next week — check my calendar for the itinerary and create a To Do task with a packing checklist."

  • "Draft a reply to the last message from my sister saying I'll call her this weekend."

  • "Move all newsletter and promotional email from this week to a 'Read Later' folder — batch 20 at a time."

The server exposes 68 discrete tools so the agent can compose its own workflow — read, triage, write, schedule, track tasks — without hardcoded macros.

Works With

  • OpenClaw — native MCP support, available via ClawHub

  • Claude Code — add to ~/.claude/settings.json under mcpServers

  • Cursor — MCP-compatible

  • Any MCP client — it's a standard stdio MCP server

Listed on the official MCP Registry as io.github.mpalermiti/outlook-mcp.


Features

68 tools across 13 categories:

  • Auth (1) -- auth status check (login is via CLI)

  • Mail Read (7) -- list inbox (with Focused Inbox and uncategorized filters), read message, bulk read by ID via $batch, search (KQL), list folders, delta-sync inbox changes, composed "since last call" digest across mail/events/contacts

  • Mail Write (3) -- send, reply/reply-all, forward

  • Mail Triage (9) -- move, delete (soft by default), flag, categorize, mark read/unread, reclassify (Focused Inbox), list/set/delete per-sender Focused Inbox overrides

  • Calendar Read (3) -- list events (with recurring expansion), get event details, delta-sync event changes

  • Calendar Write (4) -- create, update, delete, RSVP (accept/decline/tentative)

  • Contacts (7) -- list, search, get, create, update, delete, delta-sync changes

  • To Do (14) -- task lists, tasks (list/get/create/update/complete/delete), checklist items (add/update/delete), task attachments (list/download/upload/delete)

  • Drafts (5) -- list, create, update, send, delete

  • Attachments (5) -- list, download, send-with-attachments, attach-to-draft, remove-draft-attachment

  • Folder Management (3) -- create, rename, delete mail folders

  • Threading and Batch (3) -- list thread, copy message, batch triage

  • User and Admin (4) -- whoami, list calendars, list categories, mail tips

Design principles:

  • BYOID -- Bring Your Own ID. You register your own Azure AD app. No shared client ID.

  • Zero telemetry -- no analytics, no local caching, no third-party calls.

  • Token storage -- OS keyring via azure-identity (macOS Keychain, Windows Credential Store, Linux Secret Service).

  • Input validation -- all inputs validated (email, Graph IDs, OData, KQL, datetimes) before any API call.

  • Read-only mode -- set read_only: true in config to block all write operations. Note this limits the tools, not the token -- see What read_only does and does not do.

  • Soft delete -- delete moves to Deleted Items by default. Hard delete requires explicit permanent: true.

  • Timezone-aware -- calendar operations respect your configured IANA timezone.

  • Relative dates -- every datetime parameter takes ISO 8601 or an offset: 7d is seven days ago, +7d is seven days from now, now is this moment. Units: m, h, d, w.

  • Bounded attachments -- attachment reads and writes are confined to attachments_dir, so a message that asks an agent to mail a file elsewhere on disk cannot be obeyed.

  • Bounded delta cursors -- a delta_token is caller-held state, so it is untrusted input. Every URL that would carry a Graph bearer token is parsed and required to be https on graph.microsoft.com, which is what stops a poisoned cursor from redirecting your mailbox token to someone else. Its path must also be the delta endpoint of the tool it was handed to, so a cursor cannot point a delta tool at some other part of the mailbox.

  • Workflow prompts -- morning_brief, triage_folder and catch_up ship as MCP prompts, so the common sequences do not have to be reconstructed call by call.

Agent-friendly shape (1.8.0)

Two pure-code upgrades that make the same 57 tools cheaper and more recoverable for AI agents:

  • Concise mode — pass concise=True to the five high-volume read tools (outlook_list_inbox, outlook_read_message, outlook_search_mail, outlook_list_events, outlook_list_thread) to drop bulky fields: full message bodies, quoted prior-message text in threads, body previews and categories on inbox listings — typical payload reduction ~10×. On outlook_list_events the trade is different and smaller: the attendee list becomes a count, and organizer, response_status, type and show_as come off, so a concise scan cannot tell a recurring occurrence from a one-off. Default concise=False preserves the existing response shape — strict backward compat.

  • Structured Graph errors — every tool wraps msgraph SDK exceptions into {code, message, action} responses with operator-friendly recovery hints: re-auth on 401, a link to the repo's ROADMAP dead-ends list on 403/ErrorAccessDenied, re-list on 404/ErrorItemNotFound, back-off on 429, retry on 503. OutlookMCPError subclasses and validation errors pass through unchanged.


Azure AD App Registration

You need to register a free Azure AD app to get a client ID.

Prerequisites (Personal Microsoft Accounts)

Microsoft has deprecated app registration for personal accounts without an Azure AD tenant. You need to create a free Azure account first:

  1. Go to azure.microsoft.com/free and sign up with your personal @outlook.com account. Requires a credit card for identity verification but won't charge you. This creates a proper Azure AD tenant.

Register the App

  1. Go to App Registrations and sign in with your @outlook.com account.

  2. Click "+ New registration" and fill in:

    • Name: anything except Microsoft-branded terms (e.g. mp-outlook-mcp — names like "Outlook MCP" will be rejected)

    • Supported account types: select "Personal Microsoft accounts only"

    • Redirect URI: leave blank

  3. Click Register. Copy the Application (client) ID from the overview page.

  4. Go to Authentication (Preview) → Settings tab → toggle "Allow public client flows" to Yes → Save.

  5. Go to API permissions → Add a permission → Microsoft Graph → Delegated permissions → add:

    • Mail.ReadWrite, Mail.Send

    • Calendars.ReadWrite

    • Contacts.ReadWrite, Tasks.ReadWrite

    • MailboxSettings.Read

    • User.Read, offline_access

No client secret is needed. The device code flow uses public client auth.


Quick Start

Install

Option A — from PyPI (recommended):

uv tool install outlook-graph-mcp
# or: pipx install outlook-graph-mcp
# or: pip install outlook-graph-mcp

Option B — from source:

git clone https://github.com/mpalermiti/outlook-mcp.git
cd outlook-mcp
uv sync

Configure

Create ~/.outlook-mcp/config.json:

{
  "client_id": "YOUR_APPLICATION_CLIENT_ID",
  "tenant_id": "consumers",
  "timezone": "America/Los_Angeles",
  "read_only": true,
  "attachments_dir": "~/.outlook-mcp/attachments"
}

The only required field is client_id. Everything else has sensible defaults. Start with read_only: true — flip to false when you're comfortable.

Register with your MCP client

If installed from PyPI:

{
  "mcpServers": {
    "outlook": {
      "command": "outlook-mcp"
    }
  }
}

If installed from source:

{
  "mcpServers": {
    "outlook": {
      "command": "uv",
      "args": ["--directory", "/path/to/outlook-mcp", "run", "outlook-mcp"]
    }
  }
}

For OpenClaw, use the openclaw mcp CLI — it writes to mcp.servers in ~/.openclaw/openclaw.json for you:

# If installed from PyPI:
openclaw mcp set outlook '{"command":"outlook-mcp"}'

# If installed from source:
openclaw mcp set outlook '{"command":"uv","args":["--directory","/path/to/outlook-mcp","run","outlook-mcp"]}'

# Verify:
openclaw mcp list
openclaw mcp show outlook --json

Restart the OpenClaw gateway after registering. See the OpenClaw MCP docs for SSE/HTTP transport variants.

Authenticate

Run this once on the machine where the MCP server will run:

uv run outlook-mcp auth

You'll get a URL and a code. Open the URL in any browser, enter the code, and sign in with your Microsoft account. Tokens are cached in the OS keyring — the MCP server picks them up automatically.

The consent screen lists the full read-write set (Mail.ReadWrite, Mail.Send, Calendars.ReadWrite, Contacts.ReadWrite, Tasks.ReadWrite, MailboxSettings.Read, User.Read) — even when the config starts with read_only: true, because read_only gates the tools, not the token (see What read_only does and does not do), and the scopes a first consent leaves out can never be granted later without logging in again. (The one exception is read_only_consent: true, which asks for the read permissions only; it exists for a separate read-only app, described under the same heading.) Every request afterwards — silent refresh and each Graph call — uses the .default scope, which on an already-consented account means exactly "the set you granted". That ordering is deliberate: on personal accounts a first consent asking only for .default can land a session with no delegated permissions, which then can't be redeemed (AADSTS70000) without logging in again (#82).

Other CLI commands:

uv run outlook-mcp status   # Check auth status
uv run outlook-mcp logout   # Clear credentials
uv run outlook-mcp serve    # Start MCP server (default, used by OpenClaw/Claude)

Troubleshooting

me-token-to-replace is invalid on every call

You're on 1.22.0 installed after 2026-09-18. A fresh install of that version resolves microsoft-kiota-* 1.13 or later, which msgraph-core doesn't yet handle, so every /me request reaches Graph as /users/me-token-to-replace. Fixed in 1.22.1, which caps kiota below 1.13 (#80):

uv tool upgrade outlook-graph-mcp
# or: pipx upgrade outlook-graph-mcp
# or: pip install --upgrade outlook-graph-mcp

Your config and sign-in are untouched; no re-auth needed.

SSL: CERTIFICATE_VERIFY_FAILED on Linux

If auth fails with [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate, your Python environment can't find the system CA bundle. This is common on minimal/container Linux images and with the isolated venv from uv tool install.

Point Python at your system CA bundle. Set both variables — auth (via azure-identity → requests) reads REQUESTS_CA_BUNDLE, while the delta/$batch paths (via httpx) read SSL_CERT_FILE:

export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt      # httpx + Python ssl
export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt  # azure-identity auth

The path varies by distro: Debian/Ubuntu use /etc/ssl/certs/ca-certificates.crt; RHEL/Fedora use /etc/pki/tls/certs/ca-bundle.crt. If the file is missing, install your distro's CA package (ca-certificates). Set these in the same environment your MCP client launches the server from so they apply at runtime, not just to the one-time auth command.

Token cache stored unencrypted (Linux)

A one-time startup warning about the token cache falling back to plaintext means libsecret/PyGObject isn't importable — see Privacy and Security for the fix.


Tool Reference

Dates. Every datetime parameter (after, before, start, end, due, deferred_send_datetime) accepts ISO 8601 — 2026-10-22 or 2026-10-22T14:30:00Z — or a relative offset: 7d is seven days ago, +7d is seven days from now, and now is this moment. Units are m, h, d, w. Bare means ago, matching the usual CLI convention, so a due date in the future needs the +. Zone-less input is interpreted in your configured timezone; responses are always UTC.

Auth

Tool

Description

outlook_auth_status

Check if authenticated and whether read-only mode is active.

Note: Authentication is handled via the CLI (outlook-mcp auth), not through MCP tools. See Authenticate above.

Mail Read

Tool

Description

outlook_list_inbox

List messages in a folder. folder accepts display names, well-known names, or Graph IDs. Filter by read status, sender, date range, Focused Inbox classification. Pagination via skip.

outlook_read_message

Get full message by ID. Format: text, html, or full (both). Pass include_deferred_send=True to also surface the draft's scheduled delivery time.

outlook_read_messages

Bulk read up to 20 messages by ID via Graph $batch in one round-trip. Per-message shape matches outlook_read_message byte-for-byte for the same (format, concise, include_deferred_send). Partial-failure tolerant: 404s on some IDs surface in failures[] without failing the whole call. Use NOT N outlook_read_message calls.

outlook_search_mail

Search mail using KQL query. Optionally scope to a folder by name or ID.

outlook_list_folders

List mail folders with counts, parent_id, and child_count. Pass recursive=true to walk the full folder tree (subfolders included).

outlook_list_inbox_delta

List only inbox changes since the last call. First call returns a full snapshot plus a delta_token; subsequent calls (token passed back) return only added/updated/deleted items. Deletes come back as {id, is_deleted: True}. Cursor is stateless — agent persists and replays.

outlook_changes_since

One structured "since last call" digest composing mail/events/contacts deltas. Returns counts + urgent_flagged mail + top-5 by_sender + new/cancelled events. Each resource has an independent delta_token; stale-token recovery (HTTP 410) auto-resyncs that resource and surfaces _meta.resync. First-call snapshot is filtered to fallback_window_hours (default 24). Designed for recurring agent loops.

Mail Write

Tool

Description

outlook_send_message

Send email. Supports TO/CC/BCC, HTML body, importance level.

outlook_reply

Reply or reply-all to a message.

outlook_forward

Forward a message to one or more recipients with optional comment.

Mail Triage

Tool

Description

outlook_move_message

Move a message to a folder by name or ID.

outlook_delete_message

Delete a message. Soft delete (Deleted Items) by default. permanent: true for hard delete.

outlook_flag_message

Set follow-up flag: flagged, complete, or notFlagged.

outlook_categorize_message

Set categories on a message.

outlook_mark_read

Mark a message as read or unread.

outlook_reclassify_message

Move a message between Focused Inbox and Other (focused / other).

outlook_list_inbox_overrides

List Focused Inbox per-sender override rules.

outlook_set_inbox_override

Upsert a per-sender Focused Inbox override (focused / other). Case-insensitive sender matching; PATCH-if-exists, else POST.

outlook_delete_inbox_override

Delete a Focused Inbox override by ID.

Calendar Read

Tool

Description

outlook_list_events

List events in a date range. Expands recurring events. Each event carries type — occurrence or exception for an instance of a series, singleInstance for a one-off — so a listing tells recurring work apart without a second call. A seriesMaster never appears here: calendarView returns expanded instances, so use outlook_get_event to see a master. Each event also carries show_as, the free/busy status Outlook labels "Show as". Configurable via days, after, before. calendar selects which calendar to read: omit (or "primary") for the default, otherwise a display name (case-insensitive; not-found and ambiguous errors name what exists) or an ID from outlook_list_calendars. A cursor continues the listing it came from, so later pages need neither calendar nor a second lookup. concise=True omits type and show_as.

outlook_get_event

Get full event details: attendees, body, online meeting URL, recurrence, type (singleInstance / seriesMaster / occurrence / exception), show_as.

outlook_list_events_delta

List only event changes inside a window since the last call. start and end (ISO 8601) required on the first call (Graph constraint — no whole-calendar sync). Each changed event carries every field the default outlook_list_events listing returns, type and show_as included, plus is_deleted (concise=True has its own narrower shape, which the delta tool does not mirror). Unlike the listing, this endpoint does return seriesMaster items, so a caller seeding from outlook_list_events should expect ids here that the seed never held. Deletes come back as {id, is_deleted: True} and nothing else. Cursor is stateless.

Calendar Write

Tool

Description

outlook_create_event

Create event with location and attendees. (is_online has no effect on personal accounts — Graph ignores isOnlineMeeting for consumer mailboxes.) Pass recurrence to create a series: a shorthand (daily, weekdays, weekly, monthly, yearly, anchored on start) or a full Graph recurrence object for anything else. range.startDate defaults to the event's start date. show_as sets the free/busy status Outlook labels "Show as" — free, tentative, busy, oof (out of office), workingElsewhere, or unknown; omit it and Graph applies its own default of busy.

outlook_update_event

Update event fields (subject, time, location, body, attendees, all-day, show_as). Only patches changed fields. Pass recurrence to turn a single event into a series, or remove_recurrence=True to turn a series back into a single event. attendees replaces the whole guest list and emails invitations/cancellations; is_all_day needs start+end in the same call, while show_as patches on its own. Patching a time keeps the zone the event is anchored in; timezone (with start+end) re-anchors it elsewhere, which is how a series created before zones existed gets repaired. A start, end or recurrence patch to a series with edited or deleted occurrences is refused, naming them — Graph would silently discard every one.

outlook_delete_event

Delete a calendar event.

outlook_rsvp

RSVP to an event: accept, decline, or tentative. Optionally include a message.

Contacts

Tool

Description

outlook_list_contacts

List contacts with cursor pagination. Summaries carry categories; outlook_search_contacts omits the key because Graph's $search does not return it.

outlook_search_contacts

Search contacts by name or email.

outlook_get_contact

Get full contact details by ID, including home/business/other addresses, categories and personal notes.

outlook_create_contact

Create a new contact.

outlook_update_contact

Update contact fields. home_address, business_address and other_address take the shape outlook_get_contact returns — any subset of street, city, state, postal_code, country_or_region — and replace that whole address, so pass back every part you want to keep. Omit one to leave it untouched.

outlook_delete_contact

Delete a contact.

outlook_list_contacts_delta

List only contact changes since the last call. Deletes come back as {id, is_deleted: True}. Cursor is stateless.

To Do

Tool

Description

outlook_list_task_lists

List To Do lists.

outlook_list_tasks

List tasks with status filter and pagination.

outlook_get_task

Get full task details: notes (body), checklist items (ordered unchecked-first), due, recurrence flag.

outlook_create_task

Create task with due date, importance, recurrence.

outlook_update_task

Update task fields.

outlook_complete_task

Mark task as completed.

outlook_delete_task

Delete a task.

outlook_add_checklist_item

Add a checklist item (sub-step) to a task.

outlook_update_checklist_item

Update a checklist item — mark done (is_checked) or rename (partial patch).

outlook_delete_checklist_item

Delete a checklist item from a task.

outlook_list_task_attachments

List attachments on a To Do task (id, name, size, content_type) with pagination.

outlook_download_task_attachment

Download a task attachment's content to a local file (confined to attachments_dir).

outlook_upload_task_attachment

Attach a local file (from attachments_dir) to a task via inline base64 POST (1 byte – 20 MiB).

outlook_delete_task_attachment

Remove an attachment from a To Do task.

Drafts

Tool

Description

outlook_list_drafts

List draft messages with pagination.

outlook_create_draft

Create a draft. Supports scheduled delivery via deferred_send_datetime (server-side, Outlook-desktop-compatible "Delay Delivery").

outlook_update_draft

Update draft fields. Accepts is_html=True for HTML bodies and deferred_send_datetime to set or clear the scheduled delivery time.

outlook_send_draft

Send an existing draft.

outlook_delete_draft

Delete a draft.

Attachments

Since 1.20.0, these tools only reach attachments_dir (default ~/.outlook-mcp/attachments). A bare filename resolves inside it; a path outside it is refused, including via a symlink. To email a file, move it there first — or widen attachments_dir, understanding that anything reachable from it can be sent. Before 1.20.0 these tools could read any file the server process could read, which meant an email asking an agent to attach one could be obeyed.

The same fence covers the To Do attachment tools (outlook_upload_task_attachment, outlook_download_task_attachment): uploads read from attachments_dir and downloads write into it, so neither can sweep arbitrary files off disk. (Downloads are not todo_write-gated — they are reads, like outlook_download_attachment; the fence, not the category, is what confines them.)

Tool

Description

outlook_list_attachments

List attachments on a message.

outlook_download_attachment

Download an attachment and save decoded bytes into attachments_dir.

outlook_send_with_attachments

Send a message with attachments read from attachments_dir (auto upload session for >3MB).

outlook_attach_to_draft

Add attachments from attachments_dir to an existing draft (auto upload session for >3MB).

outlook_remove_draft_attachment

Remove a single attachment from a draft.

Folder Management

Tool

Description

outlook_create_folder

Create mail folder (top-level or nested).

outlook_rename_folder

Rename a mail folder.

outlook_delete_folder

Delete a mail folder (refuses well-known folders).

Threading and Batch

Tool

Description

outlook_list_thread

Get all messages in a conversation thread.

outlook_copy_message

Copy a message to another folder.

outlook_batch_triage

Batch move/flag/categorize/mark_read (max 20 per call). Single Graph /$batch round-trip — 10-20× faster than per-message calls for large triage.

User and Admin

Tool

Description

outlook_whoami

Get current user profile.

outlook_list_calendars

List available calendars.

outlook_list_categories

List category definitions with colors.

outlook_get_mail_tips

Pre-send check (OOF, delivery restrictions).


Prompts

Three workflows ship as MCP prompts, so the common sequences do not have to be reconstructed call by call. Any MCP client that supports prompts will list them; in most clients they appear as slash commands or a prompt picker.

Prompt

Arguments

What it does

morning_brief

folder (default inbox)

Today's events, unread mail and tasks due, in the cheapest order — one scan each, concise=True, batched reads.

triage_folder

folder (default inbox), count (default 50)

One cheap scan of a folder, sorted into reply / archive / junk, applied with a single outlook_batch_triage call rather than one call per message.

catch_up

since (default 24h)

What changed in mail, calendar and contacts, via the delta path — roughly ten times cheaper than re-scanning on a schedule.

They cost nothing until invoked: prompts/list carries only a name and one line each, and the body is fetched on use.


Configuration

Config lives at ~/.outlook-mcp/config.json (created with 0600 permissions on macOS and Linux; see Config permissions below for Windows). It is read as UTF-8 on every platform, and a byte-order mark is accepted. Set the OUTLOOK_MCP_CONFIG_DIR environment variable to move that settings directory (config.json, auth record, and the attachments default move with it) — see Two accounts, two instances below.

Field

Type

Default

Description

client_id

string

null

Azure AD application (client) ID. Required for auth.

tenant_id

string

"consumers"

Azure AD tenant. Use "consumers" for personal Microsoft accounts.

timezone

string

"UTC"

IANA timezone (e.g. "America/New_York"). Interprets zone-less dates, and anchors every event you create — a recurring event is expanded in this zone, so on the default "UTC" a 09:00 weekly meeting shifts an hour when the clocks change. Set it to where you are.

read_only

bool

false

When true, all write tools (send, reply, move, delete, create, update, RSVP) return an error. Gates the tools, not the Microsoft token -- see below.

read_only_consent

bool

false

When true, outlook-mcp auth asks Microsoft for the read permissions only, instead of the read-write set. For a second, read-only app registration -- see What read_only does and does not do. Requires read_only: true; the config is refused without it.

attachments_dir

string

"~/.outlook-mcp/attachments"

The only directory the attachment tools may read from or write to. Every path an agent supplies is resolved and must land inside it — a symlink out or a .. is refused. Widen it only if you understand that anything reachable can be emailed.

allow_categories

list[string]

[]

Optional. Restrict write tools to specific categories (see below). Empty list = all writes allowed when read_only: false.

allow_unencrypted_token_cache

bool

false

Permit the OAuth token cache to be written in cleartext when the platform has no encrypted store (Linux without libsecret). Off by default: authentication stops with an explanation rather than silently persisting a reusable Graph token in plaintext. macOS and Windows always encrypt and are unaffected.

Toolset selection (optional) — OUTLOOK_MCP_TOOLSETS

All 68 tool schemas load into the client's context every turn (the chars/4 proxy test_tool_surface_budget.py measures with; a different yardstick than the ~8.6k o200k figure in ROADMAP for the 62-tool surface). A client that only needs part of the surface can set the OUTLOOK_MCP_TOOLSETS environment variable to a comma-separated list of tool groups, and only those load. The account group (auth / identity) is always available.

# e.g. a recurring mail + calendar agent: ~30 tools instead of 68 (~55% fewer tool tokens/turn)
OUTLOOK_MCP_TOOLSETS="mail,calendar,digest,delta"

Groups: mail, drafts, attachments, calendar, contacts, todo, folders, digest, delta, admin. Unset (the default) loads everything — fully backward compatible. This only affects which tools are advertised; enabled tools behave identically.

Two accounts, two instances (optional) — OUTLOOK_MCP_CONFIG_DIR

One server process serves one mailbox. To work against two accounts, register two client entries and give each its own settings directory with OUTLOOK_MCP_CONFIG_DIR — pair it with OUTLOOK_MCP_TOOLSETS so each instance also only loads the tool groups it needs:

{
  "mcpServers": {
    "outlook-net": {
      "command": "outlook-mcp",
      "env": {
        "OUTLOOK_MCP_TOOLSETS": "mail,calendar,contacts",
        "OUTLOOK_MCP_CONFIG_DIR": "~/.outlook-mcp-net"
      }
    },
    "outlook-neko": {
      "command": "outlook-mcp",
      "env": {
        "OUTLOOK_MCP_TOOLSETS": "todo",
        "OUTLOOK_MCP_CONFIG_DIR": "~/.outlook-mcp-neko"
      }
    }
  }
}

Then run outlook-mcp auth once per instance, with the same env set, to write each auth record in its own directory. Each instance reads its own config.json (own client_id, timezone, permissions) from its own directory.

Only move the config directory — never HOME. The token cache is not in it: it stays in the OS keyring, and on macOS every azure-identity cache on the host shares one Keychain item, coordinated through a signal file — on this server, ~/.IdentityService/outlook-mcp.nocae (azure-identity appends .nocae to every non-CAE cache name; a CAE cache would be a different file over the same item). Both processes must keep consulting that same signal file so their cache writes lock and merge into the one shared entry — which is exactly what moving the config directory preserves and redirecting HOME (or the cache location) would break: two signal files that each believe they own the Keychain item overwrite each other's token. OUTLOOK_MCP_CONFIG_DIR deliberately moves only where config.json, the auth record, and attachments live; unset or empty keeps the default ~/.outlook-mcp.

What read_only does and does not do

read_only: true stops outlook-mcp's write tools from running. Ask it to send mail and it refuses.

It does not make your Microsoft credential read-only. The first sign-in consents the full read-write set, even with read_only: true in the config — the scopes a first consent leaves out can never be added without logging in again (every refresh afterwards uses .default -- "everything this account has already consented" -- so a session granted only read scopes would fail every write with 403 no matter what the config says). The stored token can send mail whether read_only is on or off, and a session consented before you turned read_only on keeps its write scopes.

Two consequences worth understanding:

  • read_only is a line in a text file. Anything able to edit ~/.outlook-mcp/config.json turns it off and has write access immediately -- no re-authentication, no new consent prompt.

  • The enforcement lives in this server's Python code. Any other process holding the cached token is unaffected by it.

So treat read_only as a guardrail against an agent doing something rash, not as a security boundary. If you want a credential that genuinely cannot write, have Microsoft enforce it rather than us:

  1. Register a second Azure app and give it the read permissions only: Mail.Read, Calendars.Read, Contacts.Read, Tasks.Read, MailboxSettings.Read, User.Read. It has to be an app this account has never granted write access to. Microsoft remembers consent per app, and a refresh returns everything that app was ever granted.

  2. Point client_id at it and set both keys:

    { "client_id": "<the read-only app>", "read_only": true, "read_only_consent": true }
  3. Run outlook-mcp auth. With read_only_consent the consent screen lists the read permissions only. Without it, sign-in would ask this app for the read-write set too.

read_only_consent is refused without read_only: true: a sign-in that asked only for read access cannot write, so a server expecting writes would fail on every one. And a sign-in belongs to the app it was made with. After client_id changes, the server will not use the old one — outlook-mcp status and outlook_auth_status say so until you run outlook-mcp auth again.

Granular Write Permissions (optional)

By default, read_only: false unlocks all write tools. For finer control, set allow_categories to restrict write access to specific categories. Read tools (list, search, get) are always allowed — allow_categories only narrows the write surface.

Available categories:

Category

Tools

Risk

mail_drafts

create/update/delete draft

Safe — drafts only, no send

mail_triage

move, delete (soft), flag, categorize, mark read, copy, batch

Moderate — reversible except hard delete

mail_folders

create/rename/delete folder

Moderate

mail_send

send, reply, forward, send_draft, send_with_attachments

Dangerous — sends email on your behalf

calendar_write

create/update/delete event, RSVP

Moderate — your own calendar. The parts that email other people text the agent wrote need mail_send as well: inviting attendees, rewording (subject, body, location) any event that already has them, and adding a message to an RSVP. A bare RSVP, a time change and a cancellation still notify the people involved, but carry nothing the agent wrote

contacts_write

create/update/delete contact

Moderate

todo_write

create/update/complete/delete task, checklist items; upload/delete task attachments

Moderate — your own task list, but outlook_upload_task_attachment reads local files from attachments_dir and pushes their bytes to Graph, and task/checklist/attachment deletes are irreversible. Listing and downloading attachments are plain reads, gated like every other read (not at all) and fenced to attachments_dir

Example policies:

Draft-only assistant (agent can compose drafts, you review and send):

{ "read_only": false, "allow_categories": ["mail_drafts", "mail_triage", "todo_write"] }

(Note that todo_write includes the write-side task-attachment tools — file reads from attachments_dir, uploads to Graph, and irreversible deletes. Listing and downloading task attachments are reads and are not write-gated, like the mail attachment reads — see the table above.)

Calendar-only (agent can manage your schedule, nothing else):

{ "read_only": false, "allow_categories": ["calendar_write"] }

(It cannot invite anyone. An invitation is an email, so attendees need mail_send too — add it if the agent should set up meetings with other people, not just block out your own time.)

Full write access (agent can do everything):

{ "read_only": false }

Read-only (safest default, no writes):

{ "read_only": true }

When allow_categories is set, any tool in a non-allowed category returns a permission-denied error (PermissionDeniedError) naming the blocked category. When allow_categories is empty (or unset) and read_only is false, all write tools are permitted. read_only: true always takes precedence — if set, all writes are blocked regardless of allow_categories. Unknown category names are rejected at config load time with a validation error; only the seven names above are accepted.


Privacy and Security

  • Zero telemetry. No analytics, no tracking, no usage data collected.

  • Zero local caching. Every call goes directly to Microsoft Graph. No local email/calendar storage. (One carve-out: the To Do default-list id is resolved once per process and kept for the session — an id, not content; see outlook_list_tasks.)

  • Zero third-party calls. The server only talks to graph.microsoft.com and login.microsoftonline.com.

  • Token storage. OAuth tokens are persisted via azure-identity's TokenCachePersistenceOptions. On macOS the OS Keychain is used; on Windows, DPAPI; on Linux with PyGObject/libsecret available, gnome-keyring. On Linux without libsecret (e.g. the isolated venv created by uv tool install), tokens fall back to a 0600 plaintext file at ~/.IdentityService/ and the MCP logs a one-time warning at startup. For encrypted storage on Linux, install python3-gi gnome-keyring libsecret-1-0 and re-create the venv with --system-site-packages.

  • No logging of sensitive data. Message bodies, recipient addresses, and tokens are never logged.

  • Config permissions. On macOS and Linux the config directory is created 0700 and the config file 0600, and a loose mode on the file is repaired on load. On Windows those POSIX modes cannot be enforced — os.chmod there sets only the read-only attribute — so access is governed by the path's Windows ACL, including whatever it inherits from the directory it was created under, which this server neither applies nor verifies. Symlinked configs are rejected on every platform.

  • Input validation. All user inputs (email addresses, Graph IDs, OData filters, KQL queries, datetimes) are validated and sanitized before reaching the Graph API.


Development

# Install dev dependencies
uv sync --extra dev

# Run tests
uv run pytest

# Lint
uv run ruff check src/ tests/ scripts/

# Format (CI fails if `ruff format --check` would change a file)
uv run ruff format src/ tests/ scripts/

# Run server locally (stdio)
uv run outlook-mcp

Requirements: Python 3.10+


Roadmap

  • Inbox Rules -- list, create, delete rules

  • Advanced mail -- raw MIME export, internet message headers

  • Calendar -- cancel event (with attendee notification)

  • Enterprise (Entra ID) -- work/school account support


License

MIT. See LICENSE.

Available Tools

68 tools
outlook_add_checklist_itemC

Add a checklist item (sub-step) to a To Do task.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idNo
task_idYes
display_nameYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered. The description adds nothing beyond them: it does not say whether the item is appended or prepended, whether calls are idempotent, or what the result contains.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero waste. It is efficient, though its brevity is partly under-specification rather than disciplined conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter mutation tool with no output schema and 0% schema coverage, the description is too thin: list_id is undocumented anywhere, and there is no behavioral context beyond what annotations supply.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden, yet it only loosely implies what display_name and task_id are and says nothing about the optional list_id. No format, ordering, or scoping detail is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Add) and resource (checklist item / sub-step on a To Do task). The 'add' verb implicitly distinguishes it from the sibling update_checklist_item and delete_checklist_item, though it never names them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no prerequisites, and no routing to alternatives such as update_checklist_item. The agent must infer usage from the verb alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_attach_to_draftA

Add attachments to an existing draft; auto-switches to upload-session for files >3MB.

attachment_paths resolve inside the configured attachments directory (attachments_dir, an attachments folder in the settings directory by default) — a bare filename is looked up there, and a path outside it is refused. Returns new attachment IDs for later removal via outlook_remove_draft_attachment.

ParametersJSON Schema
NameRequiredDescriptionDefault
draft_idYes
attachment_pathsYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly=false and destructive=false, and the description goes well beyond that: it discloses the >3MB upload-session auto-switch, the path-resolution/security rule (bare filename looked up in attachments_dir, outside paths refused), and the return of new attachment IDs. That is substantive operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and size-threshold behavior before the pathing detail; every sentence carries information. The parenthetical about the default directory is dense but earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully states what is returned (new attachment IDs) and how they feed into removal. Combined with the path and size behavior, an agent has enough to invoke it correctly, though draft_id semantics are not spelled out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description compensates strongly for attachment_paths by explaining resolution rules, the bare-filename case, and the outside-path rejection. draft_id is only implied by 'existing draft', but it is a self-evident identifier, leaving only a minor gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Add attachments to an existing draft' — which clearly separates it from siblings like outlook_send_with_attachments and outlook_create_draft. An agent can identify its scope without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'existing draft' and it cross-references outlook_remove_draft_attachment for cleanup, but it never explicitly states when to prefer this over alternatives such as attaching at send time. Guidance is present but inferential.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_auth_statusA
Read-only

Check authentication status. Run outlook-mcp auth on the host if needed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes that this tool is non-destructive, and the description aligns with that by saying 'Check.' The added remediation tip ('Run `outlook-mcp auth` on the host if needed') provides mild extra context about behavior when auth is missing, but no deep detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one short sentence plus a concise remediation command. Every word contributes meaning, with no fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple no-parameter status check, the description is mostly complete: it states what the tool does and what to do if auth is needed. It does not specify the exact output shape, but with no output schema and a simple status check, that is not a critical omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, and the schema coverage is complete by default. The description adds nothing about parameters, but with zero parameters the baseline score of 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The verb 'Check' clearly identifies a read-only status operation, and 'authentication status' is a specific resource. No sibling tool appears to overlap with this purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly notes that if auth is needed, the agent should run `outlook-mcp auth` on the host, which provides actionable remediation guidance. It does not explicitly state when to prefer this tool over siblings, but the purpose is distinct enough that this is not a major gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_batch_triageA

Triage up to 20 messages in one $batch call.

action is "move", "flag", "categorize", or "mark_read".

Example: outlook_batch_triage(message_ids=[id1, id2], action="move", value="Archive") value is the action target (folder name for move, status for flag/mark_read, category name for categorize). Hard cap of 20.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYes
actionYes
message_idsYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (readOnlyHint=false, destructiveHint=false) indicate mutation but no destruction. Description adds batch behavior, hard cap, and example, confirming it modifies messages without being destructive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences with an example, no fluff. Purpose and parameters are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers key aspects—batch size, actions, parameters—for a mutating batch tool. No output schema, but return likely success/failure; description could mention result, but not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description fully explains action values (move, flag, categorize, mark_read) and value meaning (folder name, status, category name). Example illustrates usage. Message_ids implied as list of IDs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it triages up to 20 messages in a batch call, with specific actions (move, flag, categorize, mark_read). Distinguishes from sibling tools that operate on single messages or other operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly defines batch scope and hard cap of 20, indicating bulk usage. Does not explicitly state when not to use or provide alternatives, but context implies it for batch operations instead of individual tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_categorize_messageA
Idempotent

Set categories on a message (replaces the full list).

Example: outlook_categorize_message(message_id=..., categories=["Follow-up", "Pricing"])

ParametersJSON Schema
NameRequiredDescriptionDefault
categoriesYes
message_idYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and the description adds the crucial detail that categories are fully replaced rather than appended — behavior not captured by the annotations. It does not, however, spell out the consequence of omitting previously set categories or any auth/rate-limit context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short lines with the core semantic constraint front-loaded and a concrete example that shows valid argument shapes. No filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter mutation with no output schema and full annotation coverage, the description supplies the one non-obvious behavior (replacement) plus a usage example. Minor gaps remain around message_id format and error behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate; it names both parameters in the example and explains that 'categories' is a full replacement list, which is meaningful. message_id is left entirely to inference, so it does not fully close the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Set) and resource (categories on a message) and clarifies the replace-list semantics, which an agent could not infer from the name alone. It stops short of naming the sibling tools it complements or contrasts with (e.g. outlook_list_categories), so it is clear but not sibling-differentiating.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical '(replaces the full list)' implies when this tool is appropriate versus an additive categorization call, but there is no explicit when-to-use/when-not guidance or reference to alternatives. Usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_changes_sinceA
Read-only

One structured "since last call" digest across mail, events, and contacts.

Use this for recurring agent loops (morning brief, hourly inbox sweep) — one call returns counts, urgent_flagged mail, by-sender rollup, plus new/cancelled events and contacts counts. Use the three individual delta tools (outlook_list_inbox_delta, outlook_list_events_delta, outlook_list_contacts_delta) when you need raw item lists or per-resource control.

Example: first call: outlook_changes_since(); next: outlook_changes_since(delta_tokens=). First call returns a snapshot filtered to the last fallback_window_hours (default 24) so the digest doesn't surface thousands of historical items; subsequent calls (tokens passed back) return only what changed. Each resource's token is independent — drop one stale token without re-syncing the others. If Graph 410s on a token (syncStateNotFound), that resource auto-resyncs and _meta.resync lists which one. urgent_flagged = high-importance OR flagged mail. by_sender = top 5 senders. Calendar modified[] is reserved for future use — modified events surface in new[] today (Graph delta doesn't distinguish them). Calendar organizer_email is also currently empty (the v1.9.0 delta formatter surfaces the organizer name only).

ParametersJSON Schema
NameRequiredDescriptionDefault
delta_tokensNo
fallback_window_hoursNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses key behaviors: fallback window to avoid historical items, independent tokens for each resource, auto-resync on 410 errors, and specifics about return fields (urgent_flagged, by_sender, calendar quirks). Adds value beyond readOnlyHint annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is detailed but well-organized with paragraphs and examples. Every sentence adds value, though slightly longer than minimal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description thoroughly explains return fields and edge cases (410 errors, resync, calendar quirks). Covers all necessary context for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description fully explains both parameters: delta_tokens (object from prior response, independent per resource) and fallback_window_hours (default 24, purpose of filtering historical items).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it provides a 'structured digest across mail, events, and contacts' and distinguishes from sibling delta tools which return 'raw item lists or per-resource control'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly recommends use for 'recurring agent loops' and gives concrete usage scenarios: 'morning brief, hourly inbox sweep'. It explains when to use alternatives and provides a clear example of first call vs subsequent calls with delta_tokens.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_complete_taskC

Mark a To Do task as completed.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idNo
task_idYes

TDQS

C2.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations indicate non-read-only and non-destructive, but the description adds no detail about side effects (e.g., whether completion is reversible, affects recurrence, or requires specific permissions). It does not contradict annotations, but transparency is minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence without redundancy, but it is too brief to cover essential information, making it feel under-specified rather than efficiently complete.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of output schema, the description need not detail return values, but it still omits practical context such as parameter meanings, expected prerequisites (e.g., task must exist), or any side effects. Overall, it is insufficient for an agent to invoke confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has two parameters (list_id and task_id) with no descriptions, and the tool description provides no explanation. The agent receives no semantic information about what these parameters represent or how they relate to the operation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Mark' and the object 'a To Do task as completed', which uniquely identifies the action. It is distinct from siblings like delete, update, or create tasks, though it does not explicitly contrast them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. The description simply states the action without contextual cues such as 'when a task is finished' or 'to update task status'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_copy_messageA

Copy a message to another folder (duplicates; source is unchanged).

Use outlook_move_message to remove from source. folder accepts display names, well-known names, or Graph IDs — prefer names.

ParametersJSON Schema
NameRequiredDescriptionDefault
folderYes
message_idYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the key behavioral trait that copying duplicates the message and leaves the source unchanged, which aligns with the annotations (destructiveHint: false). No additional context like auth or rate limits is provided, but the description adds value beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is exceptionally concise: two sentences with no redundancy. Every word serves a purpose, making it efficient for an AI agent to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple copy operation with no output schema, the description covers the core purpose, usage guidelines, and folder input format. It omits potential details like return values or error handling, but these are not critical given the tool's straightforward nature.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must compensate. It does so partially by explaining that the folder parameter accepts display names, well-known names, or Graph IDs (preferring names). However, the message_id parameter is not described, leaving a gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Copy a message to another folder') and specifies the behavior ('duplicates; source is unchanged'). It effectively distinguishes the tool from the sibling outlook_move_message by noting it does not remove the source.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly guides the agent on when to use this tool vs. the alternative: 'Use outlook_move_message to remove from source.' It also provides practical instructions for the folder parameter, mentioning acceptable input formats.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_create_contactC

Create a new contact with name and optional email, phone, company, title.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailNo
phoneNo
titleNo
companyNo
last_nameNo
first_nameYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate non-destructive write. The description adds minimal behavioral context, such as any duplicate handling, permission requirements, or default folder behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence efficiently conveys the tool's purpose with no redundant words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 parameters, no output schema, and no schema descriptions, the description is too minimal. It lacks information on return values, typical usage patterns, and important constraints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description lists key fields (email, phone, company, title) but does not explain their semantics or clarify that last_name is optional while first_name is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it creates a contact with name and optional fields, distinguishing it from sibling tools like outlook_update_contact or outlook_delete_contact. However, it does not explicitly differentiate from similar creation tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives like outlook_update_contact or outlook_search_contacts. The description does not specify prerequisites or context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_create_draftA

Create a draft email for later review/send (pair with outlook_send_draft).

Use this when a human should review before sending; use outlook_send_message to send immediately without review. Pass deferred_send_datetime (ISO 8601, e.g. "2026-05-06T08:00:00Z") to schedule delayed delivery — Exchange holds the message server-side after outlook_send_draft. Pass reply_to to pre-populate the Reply-To header.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNo
toYes
bccNo
bodyYes
is_htmlNo
subjectYes
reply_toNo
importanceNonormal
deferred_send_datetimeNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate non-read-only and non-destructive. The description adds context about the draft creation behavior, and clarifies that deferred_send_datetime holds the message server-side after sending. Does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences, front-loaded with the core purpose. It is efficient but could be slightly more concise by removing redundant phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 9 parameters (3 required) and no output schema, the description provides adequate high-level context but lacks detail on optional parameters and return value expectations. It is minimally complete for a standard email draft tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains only deferred_send_datetime and reply_to, but fails to describe 7 other parameters (to, subject, body, cc, bcc, is_html, importance), which are somewhat standard but still need explicit documentation for an AI agent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates a draft email for later review/send and explicitly pairs it with outlook_send_draft. It distinguishes from siblings by mentioning outlook_send_message for immediate sending.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool (when human review is needed) versus alternatives (use outlook_send_message for immediate send). It also explains the deferred_send_datetime parameter for scheduling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_create_eventA
Destructive

Create a calendar event with optional attendees, recurrence, busy status, online meeting.

Example: outlook_create_event(subject="Q3 review", start="2026-08-15T14:00:00Z", end="2026-08-15T15:00:00Z", attendees=["alice@acme.com"]) is_online is accepted but has no effect on personal accounts — Graph silently ignores isOnlineMeeting for consumer mailboxes (it returns isOnlineMeeting: False, onlineMeetingProvider: "unknown"). Teams meetings require a work/school account. start/end are ISO 8601. Passing recurrence creates a series, not a single event. It takes either a shorthand — "daily", "weekdays", "weekly", "monthly", "yearly", all anchored on start and open-ended — or a full Microsoft Graph recurrence object for anything else, e.g. every other Mon+Fri for 10 occurrences: {"pattern": {"type": "weekly", "interval": 2, "daysOfWeek": ["monday", "friday"]}, "range": {"type": "numbered", "numberOfOccurrences": 10}} range.startDate defaults to the event's start date. Prefer a bounded range ("endDate"/"numbered") when the event has attendees — a "noEnd" series invites them to every future occurrence. timezone is the IANA zone the event is anchored in, which is what a recurring series is expanded against (default: the configured zone). A zone name like America/Los_Angeles, never an abbreviation like PDT. show_as is Outlook's "Show as": "free", "tentative", "busy", "oof" (out of office), "workingElsewhere", or "unknown". Omitted, Graph defaults the event to busy.

ParametersJSON Schema
NameRequiredDescriptionDefault
endYes
bodyNo
startYes
show_asNo
subjectYes
locationNo
timezoneNo
attendeesNo
is_onlineNo
is_all_dayNo
recurrenceNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (readOnlyHint=false, destructiveHint=true); the description goes well beyond them by disclosing silent-failure behavior (`is_online` is ignored on consumer accounts and returns isOnlineMeeting: False), the series-vs-single-event consequence of passing recurrence, the default busy status when show_as is omitted, and the noEnd series pitfall that invites attendees to every future occurrence. These are exactly the behavioral traits an agent must know before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, followed by a concrete call example, then model-specific caveats. It is fairly long but nearly every sentence carries operational value; only minor tightening (e.g. the parenthetical REST response detail) could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter mutation tool with no output schema and thin annotations, the description supplies the semantics most likely to cause a bad call (recurrence, timezone, show_as, is_online). It does not state what is returned (e.g. the created event id) or any auth/permission prerequisites, which are minor gaps given no output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden, and it compensates well for the non-obvious parameters: ISO 8601 for start/end, shorthand vs full Graph recurrence object with a worked example, IANA zone names ('never an abbreviation like PDT'), the show_as enum values, and the is_online caveat. It leaves body, location, and is_all_day undocumented, but those are largely self-evident from their names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence gives a precise verb+resource ('Create a calendar event') plus the optional dimensions (attendees, recurrence, busy status, online meeting), which cleanly separates it from the sibling mutators such as outlook_update_event, outlook_rsvp, and outlook_create_task. An agent can identify this tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives conditional guidance on parameters (use a bounded recurrence range when there are attendees, prefer full Graph objects for complex patterns, is_online only works on work/school accounts), but it never states when to choose this tool over outlook_update_event or when to RSVP instead of creating. Usage context is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_create_folderA

Create a mail folder; pass parent_folder (name or ID) to nest under an existing folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
parent_folderNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Consistent with annotations (readOnlyHint=false, destructiveHint=false). Adds behavioral detail about nesting via parent_folder, which is not covered by annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with action. Every word is necessary; no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Sufficient for a simple creation tool. No output schema needed. Implicitly uses current account context. Could mention mailbox context, but not required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Description explains the parent_folder parameter's purpose (nesting by name or ID). The name parameter is self-explanatory. Adds meaning beyond the schema, which has 0% coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Create a mail folder' with specific verb and resource. Distinguishes from sibling tools like outlook_delete_folder and outlook_rename_folder by focusing on creation and nesting.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States when to use (to create a folder) and how to nest using parent_folder. No explicit when-not-to-use, but the context is clear given the sibling set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_create_taskA

Create a Microsoft To Do task with optional due date, importance, body, and recurrence.

Example: outlook_create_task(title="Send invoice", due="2026-09-01", importance="high") reminder=True requires due and sets the reminder to the due time — Graph silently drops a reminder that has no time. due takes ISO 8601 or a relative offset — note +7d is seven days from now, while a bare 7d means seven days ago. importance is "low", "normal", or "high". Defaults to the user's default list when list_id is omitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
dueNo
bodyNo
titleYes
list_idNo
reminderNo
importanceNo
recurrenceNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false, so the description adds real value: it discloses the reminder/due dependency and the non-obvious fact that Graph silently drops a reminder with no time. It also explains relative-offset semantics and default-list fallback, though it omits auth/rate-limit context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with verb, then a concrete example, then the gotchas. Dense but every sentence adds a distinct constraint; the backtick-heavy formatting is slightly cluttered but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter mutation tool with no output schema and only safety annotations, the description supplies the key behavioral gotchas and most parameter semantics. It falls short on the recurrence object format and body, which an agent would need for those fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden and does so for due, importance (enum values), reminder, list_id, and title. It leaves body and especially recurrence (a nested object) unexplained, which is a meaningful gap given the low coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a Microsoft To Do task') and enumerates the optional attributes. The 'Microsoft To Do task' domain cleanly separates it from calendar/contact/draft creation siblings, so an agent can route without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the self-evident create action, and the reminder/due coupling acts as a precondition. However, there is no explicit when-to-use routing against siblings like outlook_update_task or outlook_create_event, and no exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_delete_checklist_itemB
Destructive

Delete a checklist item from a To Do task.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idNo
task_idYes
checklist_item_idYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the agent knows this is a destructive write. The description restates the deletion but adds no extra behavioral context, such as whether the operation is reversible, what permissions are required, or what happens to the parent task.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted words. It is appropriately sized for a simple deletion tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation with three parameters, no output schema, and 0% schema description coverage, the description is too thin. It should at least clarify the required identifiers or the effect of the deletion, even if annotations cover the safety profile.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for all three parameters. It implies that a 'To Do task' and 'checklist item' are involved, but it does not explain the required task_id/checklist_item_id or the optional list_id, nor does it clarify identifier formats.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Delete') on a specific resource ('checklist item') within a specific context ('a To Do task'). It also implicitly distinguishes itself from sibling tools such as outlook_add_checklist_item and outlook_update_checklist_item, which operate on the same resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives like outlook_update_checklist_item, outlook_delete_task, or outlook_complete_task. It also omits prerequisites or conditions, such as whether the task must be open or whether ownership is required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_delete_contactC
Destructive

Delete a contact by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
contact_idYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description aligns with annotations (destructiveHint=true) but does not add behavioral context beyond what annotations already provide. For instance, it does not disclose whether deletion is permanent, requires confirmation, or impacts related data. With annotations present, the description should add context but fails to do so.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence with no wasted words. It could potentially benefit from a bit more detail, but it remains appropriately sized for a simple tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one parameter and no output schema, the description is minimally adequate: it states the core action. However, it lacks detail on error handling, expected response, or ID format, which limits completeness for an agent that must produce correct arguments.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description does not explain the 'contact_id' parameter's format, source, or constraints. The agent must infer that it is an identifier without any additional guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Delete a contact by ID' clearly states the action (delete), the resource (contact), and the identifier mechanism (by ID), which distinguishes it from sibling tools like update, get, or create contact.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives (e.g., outlook_update_contact) or any prerequisites such as the existence of the contact. The agent receives no usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_delete_draftB
Destructive

Delete a draft message by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
draft_idYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description says 'delete', which matches the destructiveHint: true annotation, but adds no further behavioral detail (e.g., irreversibility, cascading effects, or permissions). With annotations already indicating destructiveness, the description contributes no new transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that conveys the core action efficiently. However, it is so brief that it sacrifices useful detail, making it borderline for conciseness rather than under-specification.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple delete-by-ID operation with annotations covering destructiveness, the description is minimally adequate. It lacks prerequisites, error conditions, or return value expectations, but no output schema exists. The tool's simplicity justifies a moderate score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single parameter (draft_id). The description mentions deletion 'by ID' but does not clarify the ID format, source, or validation constraints. This does not compensate for the missing parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Delete a draft message by ID' uses a specific verb (delete) and resource (draft), clearly differentiating it from sibling tools like outlook_delete_contact or outlook_delete_event. The action and target are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. For instance, there is no mention of conditions for deletion or distinction from outlook_update_draft or outlook_send_draft. The description lacks context for appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_delete_eventA
Destructive

Delete a calendar event by ID (cancels and notifies attendees if you're the organizer).

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark destructiveHint: true and readOnlyHint: false. The description adds valuable behavioral context: it cancels and notifies attendees if the user is the organizer. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, well-structured sentence that immediately conveys the essential action and a key behavioral detail. No extraneous information, every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple delete operation with one parameter and no output schema, the description is fairly complete. It covers the core action, the notification behavior, and the context of being the organizer. It could mention error conditions like non-existing events, but for this level of complexity, it suffices.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole parameter 'event_id' lacks any description in the input schema (0% coverage). The tool description does not provide additional meaning about the parameter, such as format or source, which is expected given the low coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action 'Delete' and the resource 'calendar event by ID', distinguishing it from sibling tools like update_event or create_event. The additional context about attendee notification further clarifies the specific behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description specifies the action and its effect but does not explicitly guide the agent on when to use it versus alternatives (e.g., canceling without notification). The context about organizer status is helpful, but explicit usage context is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_delete_folderA
Destructive

Delete a user-created mail folder by ID; refuses well-known folders (inbox, sentitems).

ParametersJSON Schema
NameRequiredDescriptionDefault
folder_idYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true. The description adds that it refuses certain folders, providing safety context beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with action and constraint. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple delete tool with one param and annotations covering destructiveness, the description is complete, addressing the key behavioral constraint (refusing system folders).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single parameter. The description says 'by ID' but doesn't specify format or how to obtain it. Minimal added meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it deletes a user-created mail folder by ID and explicitly refuses well-known folders (inbox, sentitems). This distinguishes it from sibling tools like rename or create.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for user-created folders only, and by ID. It doesn't explicitly state when not to use, but the refusal of well-known folders provides clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_delete_inbox_overrideB
Destructive

Delete a Focused Inbox per-sender override rule by its ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
override_idYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint=true, so mutation is expected. The description does not add further behavioral details such as permanence or permission requirements, but is consistent with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that efficiently conveys the core function. It is front-loaded and has no filler, though it could be enriched with a bit more context without harming conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple destructive tool with one parameter and no output schema, the description provides the minimum viable information. However, it omits how to obtain the override_id and any post-deletion effects, leaving some gaps for a complete understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% with no parameter descriptions. The description only implies the parameter is an ID by using 'by its ID', but does not explain format, source, or constraints. Minimal added value over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Delete') and the specific resource ('Focused Inbox per-sender override rule by its ID'). It is distinct from sibling tools like outlook_delete_contact which delete different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool, prerequisites (e.g., obtaining the override ID), or alternatives. The description lacks context for appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_delete_messageA
Destructive

Delete a message — soft delete (to Deleted Items) by default; permanent=True to hard-delete.

This is the canonical way to delete a message. Do NOT use outlook_move_message(folder="deleteditems") for deletion.

ParametersJSON Schema
NameRequiredDescriptionDefault
permanentNo
message_idYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The destructiveHint annotation already signals destructive behavior, and the description adds useful nuance about soft versus hard deletion. It does not detail return values or irreversibility consequences, but the essential behavioral traits are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences with no redundant information. The key guidance is front-loaded and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple delete operation with two parameters, the description provides enough context to use the tool correctly, including the distinction from a sibling tool. It omits output details, but that is not critical for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description directly explains the permanent parameter's effect, and message_id is self-explanatory given the tool purpose. Schema coverage is limited to types and titles, but the description fills the most important semantic gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool deletes a message, with a specific verb and resource. It also distinguishes this operation from the related outlook_move_message tool by explicitly warning against using move for deletion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says this is the canonical way to delete a message and instructs not to use outlook_move_message for deletion. It also clarifies the default soft-delete behavior and how to request a hard delete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_delete_taskB
Destructive

Delete a task from a Microsoft To Do list.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idNo
task_idYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare destructiveHint: true and readOnlyHint: false, so the description does not need to repeat this. The description adds no extra behavioral context such as permanence or cascading effects, but it is consistent with the destructive annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence with no superfluous words. It is well-structured and immediately conveys the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple delete operation, the description is mostly adequate, but it omits any mention of side effects (e.g., whether the deletion is permanent, whether it affects reminders or subtasks). The optional list_id parameter also raises questions about required context, which are left unanswered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no descriptions for task_id or list_id, and the description does not explain them. While task_id is presumably the identifier of the task to delete, list_id is optional and its purpose is unclear—whether it scopes to a specific task list or is irrelevant is not explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (delete) and the resource (a task from a Microsoft To Do list). It distinguishes this tool from sibling delete tools by specifying 'task', which is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly mention when to use this tool over alternatives like outlook_complete_task or outlook_update_task. However, the operation is straightforward and self-explanatory, so some guidance is implicit in the tool name and description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_delete_task_attachmentC
Destructive

Remove an attachment from a To Do task.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idNo
task_idYes
attachment_idYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds nothing beyond that restatement – it does not say whether the deletion is permanent, whether the task/list_id must exist, or whether any confirmation is required.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler, which is efficient for a simple operation. Its brevity is arguably under-specification rather than true conciseness, but the structure itself is clean.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation with 0% schema coverage, an undocumented optional list_id parameter, and no output schema, the description is too thin. An agent cannot tell what happens on success, whether the removal is reversible, or how list_id affects the operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry parameter meaning. It implies task_id and attachment_id, but says nothing about the optional list_id or its role, leaving a third of the inputs unexplained in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Remove an attachment from a To Do task'), which is clear and distinct from the closest sibling outlook_remove_draft_attachment (drafts, not tasks). It does not explicitly name that sibling or any alternative, but the resource boundary is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no preconditions (e.g. attachment must already exist on the task), and no mention of the alternative tool for removing a draft attachment. The agent must infer usage entirely from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_download_attachmentB
Idempotent

Download an attachment and write the decoded bytes to save_path on the host.

save_path is resolved inside the configured attachments directory (attachments_dir, an attachments folder in the settings directory by default) — a bare filename lands there; a path outside it is refused. Same directory for reads and writes.

ParametersJSON Schema
NameRequiredDescriptionDefault
save_pathYes
message_idYes
attachment_idYes

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare a non-read-only, idempotent, non-destructive write, but the description adds genuinely new behavior: bytes are decoded, the path is confined to attachments_dir, a bare filename resolves inside it, and out-of-directory paths are refused. That path-confinement/refusal rule is not derivable from the annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and destination are front-loaded in the first sentence, and the second paragraph is short and focused on path rules. Slightly more verbosity than needed for the 'same directory for reads and writes' note, but nothing wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and while the write target and path constraints are covered, the description omits what the tool returns (e.g., the resolved path) and how to obtain the two IDs. Adequate but with clear gaps for a three-required-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden. It explains save_path thoroughly (resolution rules, bare filename, refusal), but message_id and attachment_id get no explanation of format or where they come from, leaving two of three parameters undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Download an attachment and write the decoded bytes') and names the destination parameter, so the action and effect are unambiguous. It does not, however, distinguish itself from the similarly-named sibling outlook_download_task_attachment, which an agent could easily confuse.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description never says when to use this tool or that message_id/attachment_id must first be obtained from outlook_list_attachments or outlook_read_message. There is no exclusion or alternative routing, only the mechanics of where files land.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_download_task_attachmentA
Idempotent

Download a To Do task attachment's content to a local file.

save_path resolves inside the configured attachments directory; the write is atomic (temp file + replace), so a failed download never truncates a file already staged there.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idNo
task_idYes
save_pathYes
attachment_idYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false); the description goes beyond them usefully by disclosing that save_path is sandboxed to the configured attachments directory, that the write is atomic (temp file + replace), and that a failed download never truncates an already-staged file. Auth requirements and error/return behavior are not covered, but for a download tool this is unusually informative.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action, and the follow-up sentence is dense with non-redundant operational detail rather than filler. Nothing reads as padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description needn't explain returns, and the safety profile is annotation-covered. It communicates the destination semantics and failure behavior well; only permissions/error semantics are unaddressed, which is minor here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden, yet it only adds meaning for save_path (resolves inside the configured attachments directory). The roles of task_id, attachment_id, and list_id are left entirely to the schema names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Download) and resource (a To Do task attachment's content) with a clear destination (a local file). The qualifier 'To Do task' distinguishes it from the sibling outlook_download_attachment, which handles message attachments.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The purpose implies the usage context, but there is no explicit when-to-use guidance or routing advice against the very similar sibling outlook_download_attachment. No prerequisites or preconditions (e.g., listing attachments first) are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_flag_messageA
Idempotent

Set the follow-up flag on a message. status is "flagged", "complete", or "notFlagged".

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYes
message_idYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, so the agent knows re-flagging is safe and non-destructive; the description adds the status semantics on top. It does not mention permission requirements or what state an unflagged message returns to, but with annotations carrying the safety profile this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, purpose first, parameter values second. No filler whatsoever.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a trivial two-parameter mutation with no output schema and annotations covering the safety profile, the description gives everything needed to invoke it correctly. Only usage routing and permission context are absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and status has no enum constraint in the schema, so the description's enumeration of the three valid values ('flagged', 'complete', 'notFlagged') is the only place that meaning exists — this genuinely compensates. message_id is left implicit but is self-explanatory.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Set the follow-up flag on a message.' That is clearly distinguishable from siblings like outlook_mark_read, outlook_categorize_message, or outlook_move_message. It just doesn't explicitly name or contrast with an alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no mention of prerequisites or alternatives (e.g. when to flag vs. categorize vs. mark read). The agent must infer usage from the verb alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_forwardA
Destructive

Forward an existing message to new recipients, with optional comment.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYes
commentNo
message_idYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true, so the agent knows this mutates state. The description adds that the comment is optional and gets attached, but it does not clarify the critical behavior of whether forwarding sends immediately or only creates a draft, nor how attachments are handled. With annotations covering the safety profile, this is a moderate but real gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence with the operation and the optional parameter, no filler or redundancy. Appropriately sized for a three-parameter mutation tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema and no annotation detail beyond the safety flags, so the description should say more about the outcome of the call (e.g. does it return the new message id, does it send instantly). As written it is adequate to call the tool but incomplete about consequences, which matters for a send-type mutation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the param burden. It explains 'to' (new recipients) and 'comment' (optional), but leaves message_id completely undescribed beyond the weak implication of 'an existing message'. Two of three parameters are covered, but no format or type guidance is added.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Forward') and resource ('an existing message') and names the target ('new recipients'), which an agent can readily separate from outlook_reply and outlook_send_message. The only gap is that it never names those siblings explicitly, relying on the reader to infer the distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'to new recipients' implicitly signals the forwarding use case versus replying to the original sender, which is useful context. However, there is no explicit when-to-use guidance, no prerequisites (e.g. requires an existing message_id), and no named alternatives despite 60+ sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_get_contactA
Read-only

Get one full contact by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
contact_idYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations include readOnlyHint=true, indicating a read operation. The description's 'Get' aligns with this. It adds the detail 'full contact', implying the returned data is comprehensive, which is useful beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with five words, extremely concise and front-loaded. Every word adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple get-by-ID tool with one parameter and annotations present, the description is nearly complete. It lacks details on the return structure, but given no output schema, it is adequate for an agent to understand the tool's purpose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%. The description mentions 'by ID' but does not explain the format or source of contact_id. For a single required parameter with no schema description, more context would be beneficial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get', the resource 'contact', and the scope 'one full contact by ID'. It distinguishes from sibling tools like outlook_list_contacts (list) and outlook_search_contacts (search).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly provide when to use or when not to use this tool versus alternatives. The context is implied from the purpose, but there is no explicit guidance or mention of related tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_get_eventA
Read-only

Get one event by ID: body, attendees, organizer, recurrence, type, show_as, anchor zone.

recurrence comes back in the same shape outlook_create_event accepts; type is "singleInstance", "seriesMaster", "occurrence" or "exception". start/end are UTC; original_start_time_zone is the zone the event is anchored in.

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already covering the safety profile, the description adds genuinely useful behavioral detail about the return shape: recurrence mirrors what outlook_create_event accepts, the type discriminator values are enumerated, and the timezone semantics of start/end versus original_start_time_zone are explained. It stops short of covering failure modes (missing ID, permissions), but the added value beyond annotations is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose plus returned fields in one line, then a short second block for return-value semantics. Dense but every sentence earns its place; no padding or restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully explains the return payload's timezone and recurrence semantics, which an agent needs to interpret results. It is nearly complete for a simple read, though error and permission behavior for an unknown or inaccessible ID is left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single event_id parameter, so the description must carry the load and only says retrieval is 'by ID' without format or source guidance. It adds no syntax beyond the schema's string type, though the one-parameter simplicity keeps this from being a serious gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get one event by ID') and immediately enumerates the payload an agent can expect: body, attendees, organizer, recurrence, type, show_as, anchor zone. This cleanly distinguishes it from sibling list tools like outlook_list_events and outlook_list_events_delta.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description never says when to reach for this tool versus outlook_list_events, outlook_list_events_delta, or outlook_get_task. Retrieval-by-ID is implied by the name and schema, but no explicit context, prerequisites, or alternatives are offered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_get_mail_tipsA
Read-only

Pre-send check for recipients: out-of-office, delivery limits, mailbox-full warnings.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailsYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the tool performs a read-only check (consistent with readOnlyHint annotation) and specifies the type of information returned. No contradictions with annotations. It adds context beyond the annotation by detailing the check results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that concisely conveys the tool's purpose and behavior. Every word adds value, with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple input (one array parameter) and readOnlyHint annotation, the description adequately explains the tool's function. It could optionally mention that tips are returned per email, but the current description is sufficient for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one required parameter, 'emails', with 0% description coverage. The description mentions 'recipients' but does not explicitly name the parameter or add meaning about its format (e.g., array of email addresses). The single parameter is somewhat obvious, but the description fails to clarify the expected input structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool is for a 'pre-send check' for recipients, listing specific types of mail tips (out-of-office, delivery limits, mailbox-full warnings). This is a distinct purpose that separates it from sibling tools, which involve reading, drafting, or sending messages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage before sending emails to check recipient status. It indicates context ('pre-send') but does not explicitly state when not to use it or suggest alternatives. However, among sibling tools, sending tools are present, providing indirect guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_get_taskA
Read-only

Get full To Do task details: notes (body), checklist items, due, recurrence flag.

Use this for one task's sub-steps and notes; use outlook_list_tasks for overviews. checklist_items are ordered unchecked-first, matching the To Do client. list_id is only needed when the task lives in a non-default list.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idNo
task_idYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already tells the agent this is a safe read. The description adds real behavioral context beyond that: checklist_items are returned ordered unchecked-first 'matching the To Do client', and list_id is only needed for non-default lists. It stops short of covering failure modes (e.g., behavior when task_id is not found).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, zero filler, with the returned-field list front-loaded before the usage routing and the list_id caveat. Every sentence carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly enumerates the returned fields (body/notes, checklist items, due, recurrence flag), which is what an agent needs to interpret results. It covers the required task_id implicitly and the optional list_id explicitly; only a note on error behavior or task_id format is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden. It successfully explains list_id's conditional nature ('only needed when the task lives in a non-default list'), which is genuine added meaning, but task_id is left entirely unexplained. One of two parameters is covered, so it is only partial compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (To Do task details) and enumerates the returned fields: notes/body, checklist items, due, recurrence flag. It explicitly names outlook_list_tasks as the overview alternative, so an agent can distinguish it from the sibling without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear routing: use this for one task's sub-steps and notes, use outlook_list_tasks for overviews. It covers when-to-use and one named alternative, but does not address other task siblings such as outlook_update_task or outlook_complete_task, so there is no explicit when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_list_attachmentsA
Read-only

List attachments on a message — returns IDs, names, sizes, and content types.

ParametersJSON Schema
NameRequiredDescriptionDefault
message_idYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds return field details but omits potential errors, pagination, or size limits. With annotations covering the core safety, this is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with no wasted words. Front-loaded with verb and resource, then return details. Perfectly concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with one parameter, the description is fairly complete: it states the action and return fields. No output schema exists, but the description compensates partially. Missing details like authentication or response format, but the system context likely covers those.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must explain parameters. The description does not mention message_id at all; it only says 'on a message'. The parameter name is self-descriptive, but description fails to add explicit meaning. This is a gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states verb 'list', resource 'attachments on a message', and enumerates returned fields (IDs, names, sizes, content types). This distinguishes it from siblings like outlook_download_attachment (downloads) and outlook_attach_to_draft (adds).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Context is clear: use to list attachments given a message_id. However, no explicit guidance on when not to use or alternatives beyond the name itself. The description provides sufficient context for a simple tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_list_calendarsA
Read-only

List all calendars available to the authenticated user (primary + secondary).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds behavioral details beyond the readOnlyHint annotation by specifying that it returns primary and secondary calendars. Annotations already indicate read-only, so the description supplements without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that immediately conveys the tool's purpose. No extraneous words or information, perfectly front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters, no output schema, and annotations provide safety context, the description is complete. It fully informs the agent of what the tool does and its scope.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so schema coverage is 100%. The description does not need to add parameter information. According to guidelines, baseline is 4 for 0 parameters, and no additional param info is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List all calendars available to the authenticated user (primary + secondary).' It uses a specific verb 'List' and resource 'calendars', and distinguishes itself from sibling tools by specifying the scope and inclusion of primary and secondary calendars.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies that this tool is used when you need a list of all calendars, which is a simple and clear use case. However, it does not explicitly mention alternatives or when not to use it, but given there are no parameters and the purpose is straightforward, it's sufficiently clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_list_categoriesA
Read-only

List the user's master category definitions (names + colors).

Provides the valid values for outlook_categorize_message.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation is present, and the description confirms a read-only operation ('List'). No contradictions, and the description adds context about return values (names+colors).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action. No wasted words, and the second sentence adds valuable context about its relationship to another tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters, no output schema, and a readOnlyHint annotation, the description is complete: it states what is returned and why it is useful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters with 100% coverage (by default). The description does not need to add parameter info, and the baseline for 0 parameters is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List the user's master category definitions') and the output (names + colors). It also distinguishes its purpose by noting it provides valid values for another tool (outlook_categorize_message).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool (before categorizing a message to get allowed categories) and references a sibling tool (outlook_categorize_message). It does not explicitly state when not to use it, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_list_contactsA
Read-only

List contacts with cursor pagination.

Use for one-shot queries; use outlook_list_contacts_delta for polling/recurring agents.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, describing a safe read operation. The description adds the cursor pagination detail. Otherwise no extra info on rate limits, permissions, or other behavioral traits. Adequate but minimal beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two clean sentences with no wasted words. Front-loaded with core functionality, then usage distinction. Ideal conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is adequate for a simple list tool with pagination, but lacks details about what the tool returns (e.g., list of contacts). Given no output schema, some mention of the response would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must add meaning. It mentions 'cursor pagination' which loosely relates to the cursor parameter, but provides no explanation of count, cursor format, or how they work. Very limited added value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists contacts with cursor pagination (verb+resource+pagination). It hints at a different use vs. the delta variant, but doesn't explicitly distinguish from other contact listing tools like outlook_search_contacts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use this tool (one-shot queries) and when to use an alternative (outlook_list_contacts_delta for polling/recurring). This is clear and differentiation guide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_list_contacts_deltaA
Read-only

List only contact changes since the last call.

Use this for polling/recurring agents — typically 10x cheaper than outlook_list_contacts after the first call. Use outlook_list_contacts for one-shot queries.

Example: first call: outlook_list_contacts_delta(); next: outlook_list_contacts_delta(delta_token=). is_deleted=True items are tombstones (drop cached payload). has_more=True means drain immediately by passing the returned delta_token back.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_sizeNo
delta_tokenNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true, and description adds important behavioral details: tombstones (is_deleted=True items should be dropped), pagination (has_more means drain immediately), and cost implications. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise yet comprehensive. First sentence clearly states purpose, followed by usage guidance, example, and edge cases. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a delta/polling tool with no output schema, the description sufficiently covers return behavior (tombstones, has_more), pagination strategy, and cost benefits. Complete enough for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must compensate. It explains delta_token as a token from prior response and the has_more pattern, but does not detail page_size defaults or ranges. Adequate for context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'List only contact changes since the last call' with a specific verb and resource. It distinguishes itself from sibling tools like outlook_list_contacts (full list) and outlook_list_events_delta (different resource).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly recommends use for polling/recurring agents, notes cost advantage over outlook_list_contacts, and advises using outlook_list_contacts for one-shot queries. Provides example usage and explains pagination with has_more and delta_token.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_list_draftsA
Read-only

List messages in the Drafts folder with cursor pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already indicates a read-only operation. The description adds the behavior of cursor pagination, which is useful implementation detail beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence with no unnecessary words. It is well-structured and to the point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While the basic purpose is clear, the description does not mention ordering, default count, how to obtain the next page, or any additional behavior. Combined with the lack of parameter details, the context is somewhat incomplete for an agent to use it effectively without additional inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema lacks descriptions for count and cursor, and the description only mentions 'cursor pagination' without explaining how the parameters work. This leaves the agent guessing about parameter semantics, especially since schema coverage is 0%.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists messages in the Drafts folder, which is a specific verb and resource. It differentiates from sibling tools like outlook_list_inbox and outlook_list_folders by specifying the Drafts folder.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates the purpose but does not explicitly state when to use this tool versus alternatives. No when-not guidance is provided, though the tool name and context give some implicit clues.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_list_eventsA
Read-only

List calendar events in a date range (expands recurring instances).

Use for one-shot queries; use outlook_list_events_delta for polling/recurring agents.

Pass concise=True for day-at-a-glance scans: drops organizer, response_status, type and show_as; adds is_organizer and attendees_count; spells is_online as is_online_meeting.

calendar: a display name or an ID from outlook_list_calendars; omit for the default calendar. A cursor continues the listing it came from.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
afterNo
countNo
beforeNo
cursorNo
conciseNo
calendarNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond readOnlyHint=true by disclosing that recurring instances are expanded, the exact field-level effects of concise=True (drops organizer/response_status/type/show_as, adds is_organizer/attendees_count, renames is_online), and that a cursor only continues the listing it came from.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the sibling rule, then tight, information-dense clauses. No filler sentences; every line adds an actionable fact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the concise-mode field mapping usefully substitutes for describing the return shape, and recurring expansion plus cursor semantics are covered. However, pagination/count limits and the date-parameter formats are unaddressed, leaving how the range is actually computed ambiguous.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description carries the burden and does well for the non-obvious params: calendar (display name or ID from outlook_list_calendars, omit for default), concise (full field mapping), and cursor (continuation semantics). It leaves days/after/before/count unexplained, including their formats and how they interact, which is the tool's central range-selection logic.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope: 'List calendar events in a date range (expands recurring instances).' It also explicitly names the sibling it is not (outlook_list_events_delta), so an agent can distinguish it without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing rule: 'Use for one-shot queries; use outlook_list_events_delta for polling/recurring agents.' It adds a second conditional for concise mode ('day-at-a-glance scans') and clarifies cursor reuse, covering when-to-use and which alternative to pick.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_list_events_deltaA
Read-only

List only calendar event changes within a window since the last call.

Use this for polling/recurring agents — typically 10x cheaper than outlook_list_events after the first call. Use outlook_list_events for one-shot queries.

Example: first call: outlook_list_events_delta(start="2026-05-22T00:00:00Z", end="2026-05-29T00:00:00Z"); next: outlook_list_events_delta(delta_token=). start/end (ISO 8601) required on first call only; the cursor encodes the window thereafter. is_deleted=True items are tombstones. has_more=True means drain immediately.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNo
startNo
page_sizeNo
delta_tokenNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotation already indicates readOnlyHint=true. The description adds useful behavioral context: explains the delta token mechanism, first-call requirements, and the meaning of is_deleted and has_more fields. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact (4 sentences plus example) and front-loaded: purpose first, then usage guidance, then example, then additional notes. Every sentence adds unique value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of a delta endpoint and the absence of an output schema, the description covers the key behaviors (paginated result, is_deleted tombstones, has_more flag). It could be slightly more explicit about the response structure (e.g., that it returns event objects), but is largely sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden. It explains start/end (required on first call, ISO 8601), delta_token (used subsequently), but does not describe page_size. This covers 3 of 4 parameters with meaningful context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states it lists 'calendar event changes within a window since the last call,' which is specific and actionable. It clearly distinguishes from the sibling tool outlook_list_events by positioning this as the delta/change-tracking variant.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: 'Use this for polling/recurring agents — typically 10x cheaper than outlook_list_events after the first call. Use outlook_list_events for one-shot queries.' This directly tells the agent when and when not to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_list_foldersA
Read-only

List mail folders with message counts, parent_id, and child count.

Default is top-level only; pass recursive=True to walk the full tree and resolve subfolder names.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNo
recursiveNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true. The description adds behavioral context about recursion resolving subfolder names. No mention of pagination or performance, but adequate for a read-only list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no redundant words. Front-loaded with purpose and key details. Efficient and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema; the description lists returned fields (message counts, parent_id, child count) adequately. However, the cursor parameter is not addressed, and some potential behavior like pagination is omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%. The description explains the recursive parameter but does not mention the cursor parameter, leaving its purpose unclear. Only one of two parameters is documented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists mail folders and specifies the returned data (message counts, parent_id, child count). It distinguishes from siblings like outlook_create_folder or outlook_delete_folder by focusing on read-only listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains default behavior (top-level only) and when to use recursive=True. It doesn't explicitly state when not to use the tool, but the context of siblings makes usage clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_list_inboxA
Read-only

List messages in one folder with structured filters (read, sender, date, category, Focused).

Use this for folder-scoped browsing; use outlook_search_mail for KQL full-text search across all folders. For polling/recurring agents use outlook_list_inbox_delta (typically 10x cheaper after the first call).

Example: outlook_list_inbox(folder="Junk Email", unread_only=True, count=5) folder accepts display names, well-known names ("inbox", "junkemail"), or Graph IDs — prefer names. Pass concise=True to drop large fields (preview, categories) — ~10x fewer tokens. Pass uncategorized_only=True to return only messages with no categories assigned. after/before take ISO 8601 or a relative offset — 7d is seven days ago, +7d is seven days from now.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNo
afterNo
countNo
beforeNo
cursorNo
folderNoinbox
conciseNo
unread_onlyNo
from_addressNo
classificationNo
uncategorized_onlyNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations supply readOnlyHint=true, so the safety profile is covered, but the description adds genuinely non-obvious behavioral context: concise=True drops large fields for ~10x token savings, uncategorized_only filtering, and the accepted forms for `folder`. It stops short of describing pagination/cursor behavior or default page size, which is the remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose before routing guidance, examples, and parameter notes; each sentence carries distinct information. It is somewhat long, but no line is padding given the 0% schema coverage it must compensate for.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter list tool with no output schema, the description covers routing, token-cost tradeoffs, filter semantics, and date formats well. The notable omission is pagination behavior (cursor/skip) and any statement about result ordering or limits, which an agent browsing large folders would need.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden and largely meets it: it clarifies `folder` accepted formats, the effect of concise and uncategorized_only, and the ISO 8601/relative-offset semantics of after/before. However cursor, skip, from_address, and classification receive no explanation, leaving several of the 11 params undocumented anywhere.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list messages) plus its scope constraint (one folder) and the filter dimensions it supports (read, sender, date, category, Focused). It explicitly names sibling tools it is not (outlook_search_mail for cross-folder full-text, outlook_list_inbox_delta for polling), so an agent can distinguish it without reading schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use routing: folder-scoped browsing vs outlook_search_mail for KQL search across all folders, and a concrete condition for choosing outlook_list_inbox_delta (polling/recurring agents, ~10x cheaper after first call). Includes a worked example invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_list_inbox_deltaA
Read-only

List only inbox changes since the last call.

Use this for polling/recurring agents — typically 10x cheaper than outlook_list_inbox after the first call. Use outlook_list_inbox for one-shot snapshots.

Example: first call: outlook_list_inbox_delta(); next: outlook_list_inbox_delta(delta_token=). is_deleted=True items are tombstones (drop cached payload). has_more=True means drain immediately by passing the returned delta_token back.

ParametersJSON Schema
NameRequiredDescriptionDefault
folderNoinbox
page_sizeNo
delta_tokenNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation is consistent with the description. The description further explains behavior around tombstones (is_deleted) and pagination (has_more), giving the agent a clear mental model of the response semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured, with every sentence serving a purpose: usage guidance, example, and pagination semantics. No fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential delta and pagination behavior despite the lack of an output schema. It could be slightly more complete by describing the return items more explicitly, but the core usage is fully understandable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains delta_token's role through the example, but folder and page_size are not described beyond their schema titles/defaults. Since schema description coverage is 0%, more parameter-level detail would be beneficial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool lists inbox changes since the last call, with a specific verb and resource. It also distinguishes itself from outlook_list_inbox by noting cost and appropriate use cases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use this tool (polling/recurring) versus outlook_list_inbox (one-shot snapshots). Provides a concrete usage example for the first and subsequent calls, plus pagination instructions via has_more and delta_token.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_list_inbox_overridesA
Read-only

List the user's Focused Inbox per-sender override rules.

Each override forces mail from a given sender into Focused or Other regardless of Graph's inference.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explains the meaning of the override rules themselves, but it does not disclose the tool's own behavior beyond listing. It lacks details about the return format, pagination, or explicit confirmation that no modifications occur, though the readOnlyHint annotation partially covers this.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, consisting of two short sentences that directly state the purpose and clarify the domain concept. There is no unnecessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list operation with no parameters, the description sufficiently explains what the tool does and what the data represents. It provides enough context for an agent to understand when to call it, and the readOnlyHint annotation covers safety expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so there is nothing to explain. The description does not need to add any parameter-related semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List' and the specific resource 'the user's Focused Inbox per-sender override rules'. It further explains what an override does, making the tool's purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly mention when to use this tool versus alternatives like set_inbox_override or delete_inbox_override. While the list operation is self-explanatory, no direct guidance is provided about using this for viewing overrides or modifying them with sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_list_task_attachmentsA
Read-only

List attachments on a To Do task (id, name, size, content_type) with pagination.

Use outlook_download_task_attachment with an id from here to save the content. has_more=True means pass next_cursor back for the next page.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo
list_idNo
task_idYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuine behavioral detail beyond that: the pagination contract ('has_more=True means pass next_cursor back for the next page') and the shape of returned items. It omits details like default page size or cursor lifetime.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first clause, and the two following sentences each deliver a distinct actionable fact (download routing, pagination). No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly enumerates the returned fields and the pagination flag, so an agent knows what it gets back. It is nearly complete, missing only coverage of the optional 'list_id' parameter and the 'count' control.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden. It explains the pagination cursor ('next_cursor' back-and-forth) and implies 'task_id' via 'on a To Do task', but 'list_id' and 'count' are never mentioned, leaving two of four parameters undocumented anywhere.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List attachments on a To Do task') and enumerates the returned fields (id, name, size, content_type). It is clearly distinguishable from the sibling 'outlook_download_task_attachment', which it explicitly names as the follow-up.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: use 'outlook_download_task_attachment' with an id from this result to save content, which is a concrete when-to-use-next instruction. It does not state any when-not conditions or prerequisites (e.g., task must exist), so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_list_task_listsA
Read-only

List all Microsoft To Do task lists for the current user.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds context beyond the readOnlyHint annotation by specifying the scope ('for the current user'). It confirms no destructive effects and aligns with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that is concise and front-loaded with the action and resource. Every word is necessary and informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter read-only listing tool, the description is complete. It tells what the tool does, its scope, and its safety. No output schema is needed as return format is standard.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so the schema coverage is 100%. The description does not need to add parameter details, and the baseline score of 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List' and resource 'task lists', and the name 'outlook_list_task_lists' is specific. It distinguishes from sibling tools like 'outlook_list_tasks' which lists tasks within a list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use when you need all task lists for the current user. It does not explicitly state when not to use it or mention alternatives, but for a simple list operation this is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_list_tasksB
Read-only

List tasks in a To Do list with optional status filter.

status: "notStarted", "inProgress", or "completed".

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo
statusNo
list_idNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, consistent with 'list'. Description adds no further behavioral details (e.g., pagination behavior via cursor, count defaults). It does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no extraneous information. Essential facts front-loaded. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Lacks details on pagination (cursor, count defaults), return format, and the role of list_id. For a list tool with no output schema, this is insufficient for full understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so description must explain parameters. It only documents the 'status' parameter with allowed values. 'count', 'cursor', and 'list_id' are not explained, leaving 3 of 4 parameters underspecified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the action 'list tasks', the resource 'in a To Do list', and the optional 'status' filter. It distinguishes from sibling tools like outlook_list_task_lists by specifying tasks within a list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., outlook_list_task_lists, outlook_create_task). The description only mentions an optional filter but does not explain prerequisites or exclusive conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_list_threadA
Read-only

List all messages in a conversation thread, chronological order.

Needs conversation_id from a message's metadata. Pass concise=True to drop large fields (quoted prior-message text in each preview) — ~10x fewer tokens on long reply chains.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
conciseNo
conversation_idYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description explains ordering (chronological) and the effect of the concise parameter, adding behavioral context beyond the readOnlyHint annotation. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose, followed by prerequisite and a performance tip. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers ordering, prerequisite, and concise hint. Does not mention pagination or maximum results, but for a straightforward list tool with annotations, it is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Explains conversation_id (prerequisite) and concise (effect), but does not explain the count parameter (default 50). With 0% schema description coverage, the description partially compensates but leaves a gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'List all messages in a conversation thread, chronological order.' It uses a specific verb and resource, distinguishing it from siblings like outlook_read_message (single message) or outlook_list_folders.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly mentions prerequisite 'Needs conversation_id from a message's metadata' and provides a tip for using concise=True on long threads. Does not compare to siblings or state when not to use, but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_mark_readC
Idempotent

Mark a single message as read or unread (set is_read=True or False).

ParametersJSON Schema
NameRequiredDescriptionDefault
is_readYes
message_idYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety/mutation profile is covered. The description adds only the "single message" scope and restates the boolean semantics, leaving permissions, side effects, and response behavior undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the action front-loaded and no wasted words. It is efficiently sized for a simple two-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple toggle tool with no output schema and annotations covering safety, the description is minimally adequate but omits any guidance on message_id validity, error behavior, or relationship to sibling read tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden. It clarifies that is_read toggles read vs unread, but message_id is never explained and no format/constraint details are added for either parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Mark a single message as read or unread") and scopes it to a single message, which implicitly separates it from batch or content-reading siblings. It does not explicitly name the alternative such as outlook_read_message, so it falls short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use guidance and no exclusions, so an agent gets no help distinguishing it from siblings like outlook_read_message or outlook_flag_message. Usage is only inferable from the verb itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_move_messageA

Move a message to another folder (removes from source).

Use outlook_copy_message to duplicate without removing the source. For deletion use outlook_delete_message (not move to "deleteditems"). folder accepts display names, well-known names ("inbox", "archive", "deleteditems"), or Graph IDs — prefer names.

ParametersJSON Schema
NameRequiredDescriptionDefault
folderYes
message_idYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly states 'removes from source', making the destructive nature of the operation clear, which is not fully captured by the annotations (destructiveHint: false). This transparency helps the agent understand the side effect of moving.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with two sentences: the first states the purpose and effect, the second provides usage alternatives and parameter details. No redundant information, well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core purpose, effect, alternatives, and parameter behavior. No output schema is provided, but the tool's return is not complex. The description is sufficient for an agent to decide when and how to use this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The folder parameter is well explained (display names, well-known names, Graph IDs, prefer names), adding value beyond the schema. The message_id parameter is not described but is self-explanatory as a message identifier. Since schema coverage is 0%, the description compensates for one of two parameters adequately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Move' and the resource 'message', and explicitly distinguishes from copy and delete operations. It also clarifies that moving removes the message from the source folder, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use sibling tools: use outlook_copy_message for duplication, outlook_delete_message for deletion, and warns against using move to 'deleteditems' as a deletion method. Also explains the folder parameter accepts display names, well-known names, or Graph IDs, with a preference for names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_read_messageA
Read-only

Get one full message by ID. format is "text", "html", or "full" (both).

Pass include_deferred_send=True to also return the scheduled-send time (PR_DEFERRED_SEND_TIME) as deferred_send_datetime — useful when recreating a delayed draft. Pass concise=True to drop large fields (body, body_html) and return a 200-char body_preview — ~10x fewer tokens for triage scans.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNotext
conciseNo
message_idYes
include_deferred_sendNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses that concise=True drops large fields and returns a preview, and include_deferred_send returns scheduled-send time. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficient: a two-sentence intro plus two brief bullet points. Front-loaded with core purpose, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description covers parameter effects and return modifications. Could mention default response structure, but the detail provided is sufficient for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Since schema coverage is 0%, the description compensates by explaining format values, concise behavior, and deferred send parameter. Message_id is self-explanatory. Adds necessary meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves one full message by ID, with specific format options. This distinguishes it from sibling tools like outlook_list_thread or outlook_download_attachment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides guidance on when to use concise mode for token-saving triage and include_deferred_send for scheduled times. However, it lacks explicit contrast with alternatives like outlook_batch_triage or when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_read_messagesA
Read-only

Bulk read up to 20 messages by ID via $batch — use NOT N outlook_read_message calls.

Per-message shape in messages matches outlook_read_message byte-for-byte for the same (format, concise, include_deferred_send). Ordering follows input message_ids. Returns {messages, failures, requested, succeeded, failed} — 404s on some IDs are surfaced in failures without failing the whole call (partial-failure tolerant).

Example: outlook_read_messages(message_ids=[id1, id2, id3], concise=True) Hard cap of 20 (Graph $batch limit).

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNotext
conciseNo
message_idsYes
include_deferred_sendNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation covers the read-only nature, and the description adds useful behavioral details: ordering follows input message_ids, partial 404s are surfaced in failures, and the call does not fail entirely. Minor gap: no mention of auth requirements or rate-limit consequences beyond the $batch cap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tight and well-structured, with a clear purpose, return shape, example, and limit. The formatting is efficient and every sentence adds relevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a bulk read tool, it adequately covers return shape, partial failures, ordering, and limits. It does not provide an output schema, but the return keys are listed and the per-message shape is delegated to a sibling tool, which is reasonable given the context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no parameter descriptions, and the description only partially compensates. It explains message_ids ordering and references outlook_read_message for format, concise, and include_deferred_send semantics, but does not define those parameter values or effects directly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: bulk reading up to 20 messages by ID via $batch. It explicitly distinguishes itself from the single-message counterpart by saying to use this instead of N individual outlook_read_message calls.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit usage guidance by naming the alternative (outlook_read_message), stating the hard cap of 20, and noting partial-failure tolerance. This makes it clear when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_reclassify_messageA

Reclassify ONE message's Focused/Other placement. classification is "focused" or "other".

Use this to fix a single message; use outlook_set_inbox_override for a sticky rule that affects future messages from the same sender.

ParametersJSON Schema
NameRequiredDescriptionDefault
message_idYes
classificationYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description accurately implies a mutating action (reclassify) and notes the non-destructive nature via annotations. It does not detail side effects or reversibility, but given the simple scope and the existing annotation hints (readOnly=false, destructive=false), the provided information is adequate for typical usage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, using two short sentences to convey the action, a key parameter value, and the alternative tool. No redundant or filler content is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with only two parameters and no output schema, the description covers all necessary aspects: what it does, the classification values, and when to prefer an alternative. No additional context is needed for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explicitly specifies the allowed values for `classification` ('focused' or 'other'), which is critical information not present in the schema. `message_id` is self-explanatory and no further detail is necessary. This compensates for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action ('Reclassify'), the resource ('message'), and the specific scope ('Focused/Other placement'). The contrast with outlook_set_inbox_override also distinguishes it from a similar sibling tool, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use this tool ('fix a single message') and when to use an alternative (outlook_set_inbox_override for sticky rules). This gives direct guidance on choosing between related tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_remove_draft_attachmentB
Destructive

Remove a single attachment from a draft message by attachment ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
draft_idYes
attachment_idYes

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While annotations set 'destructiveHint: true', the description only says 'remove' without elaborating on side effects, irreversibility, or any other behavioral traits beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no extra words. Every part is essential.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the basic purpose for a simple 2-parameter tool, but lacks usage guidelines and behavioral context. Adequate for minimal functionality.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description only mentions 'by attachment ID' but does not clarify the role of 'draft_id' or add meaning beyond the parameter names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (remove), target (attachment from a draft message), and key identifier (attachment ID). It is distinct from sibling tools like 'outlook_attach_to_draft' and 'outlook_download_attachment'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives (e.g., 'outlook_download_attachment'), nor any prerequisites or context for invoking it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_rename_folderB
Idempotent

Rename a user-created mail folder by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
folder_idYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds one useful behavioral constraint — that only user-created folders can be renamed, implying system folders will fail — but says nothing about error behavior, permissions, or name conflicts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler or redundancy. It is appropriately efficient, though its brevity reflects under-specification rather than tight editing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter idempotent mutation with no output schema, the description covers the core operation but omits parameter format details and failure conditions (e.g., duplicate names, non-user-created folders). Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for both parameters, so the description must compensate and largely does not. 'By ID' hints at folder_id being an identifier, but neither parameter's format, validity constraints, nor whether 'name' is the new name is clarified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (rename) and resource (user-created mail folder), which distinguishes it from outlook_create_folder and outlook_delete_folder. It does not explicitly name sibling alternatives, but the operation and target are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as outlook_create_folder or outlook_delete_folder, and no prerequisites or conditions are stated. Usage is only implied by the verb.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_replyB
Destructive

Reply (or reply-all) to an email message.

Use this for email; use outlook_rsvp for calendar meeting invites.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
is_htmlNo
reply_allNo
message_idYes

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is known. The description adds nothing beyond that: it never says the reply is sent immediately and irreversibly, whether it postdates into the source thread, or whether reply_all has recipient-broadening risk — the one behavior that matters most for this tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, no filler, with the core action front-loaded and the routing rule second. Nothing in it is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A mutation tool with no output schema, 0% schema coverage, and only terse boolean annotations needs the description to explain side effects and required inputs. It omits whether the reply is sent or drafted, what permissions are needed, and how reply_all changes recipients.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 4 parameters, so the description carries the full burden of explaining message_id, body, is_html, and reply_all. Its parenthetical '(or reply-all)' gestures at the reply_all flag but conveys no semantics for it or for the other three parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (reply) and resource (email message) and distinguishes the reply-all variant. It names one sibling, outlook_rsvp, but does not differentiate from the closer siblings outlook_forward or outlook_send_message, so an agent still has to reason about which send-path applies.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives one explicit routing rule: use this for email, use outlook_rsvp for calendar invites. That covers the calendar/email boundary but leaves the far more likely confusion (reply vs forward vs send_message vs send_draft) unaddressed, so guidance is partial.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_rsvpA
Destructive

RSVP to a calendar meeting invite. response is "accept", "decline", or "tentative".

Use this for meeting invites; use outlook_reply to reply to a regular email message.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageNo
event_idYes
responseYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation semantics are covered by structured data. The description adds the valid response vocabulary but says nothing about what RSVP actually does behaviorally (e.g. whether a notification is sent to the organizer, whether it can be changed afterward, whether the responder must be an attendee). Adequate but thin beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, with the primary purpose front-loaded and the disambiguation sentence second. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers routing and the response enum well, but for a destructive mutation with no output schema and 0% schema description coverage it omits key context: the meaning/source of event_id, the purpose of the optional message, and the consequence of the RSVP. Enough to call it, not enough to call it confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the parameter burden, and it only documents `response` (accept/decline/tentative) — a genuinely useful addition since the schema declares it as a bare string with no enum. It adds nothing about `event_id` or the optional `message`, leaving two of three parameters undocumented. Partial compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (RSVP) against a specific resource (calendar meeting invite), and immediately names the sibling tool it is confused with (outlook_reply). An agent can distinguish this from the other send/reply tools in the sibling list without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives the when-to-use and the alternative: 'Use this for meeting invites; use outlook_reply to reply to a regular email message.' The selection condition is stated, not inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_search_contactsA
Read-only

Search contacts by name or email using KQL query syntax.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
queryYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations include readOnlyHint=true, confirming a read operation. The description adds the behavioral detail of using 'KQL query syntax' but does not disclose permissions, rate limits, or other traits. Since annotations already cover the read safety, the description does not significantly extend transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single-sentence description is extremely concise and front-loaded with the essential purpose and method. No extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description should clarify return format or behavior (e.g., max results, empty result handling). It does not, making it incomplete for an agent to confidently use the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It mentions searching by name or email via KQL, giving context for the 'query' parameter. However, the 'count' parameter is entirely unaddressed, leaving a gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Search', the resource 'contacts', and the method 'by name or email using KQL query syntax'. It effectively distinguishes the tool from siblings like 'outlook_list_contacts' and 'outlook_get_contact'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for searching contacts, contrasting with listing or getting specific contacts. However, it does not explicitly state when not to use this tool or mention alternatives. The context is clear but lacks explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_search_mailA
Read-only

Full-text search mail with KQL across all folders (or one, if folder is set).

Use this for "find emails about X"; use outlook_list_inbox for structured filters scoped to a single folder.

Example: outlook_search_mail(query="from:sarah@acme.com received>=2026-01-01", count=10) query is Microsoft KQL (from:, subject:, received>=, hasattachment:true, AND/OR/NOT). Operators must be UPPERCASE — lowercase and is matched as a literal term. Two terms with no operator between them broaden the search; use AND explicitly to narrow. Pass concise=True to drop large fields (preview, categories) — ~10x fewer tokens.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
queryYes
cursorNo
folderNo
conciseNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate readOnlyHint. The description adds behavioral details: it searches all folders unless folder is specified, explains the effect of concise=True on token count, and notes that lowercase operators are treated as literals, which affects query results. It does not contradict the read-only annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a compact paragraph that covers purpose, alternative, example, query syntax, and output size option. Each sentence adds new information; no fluff. It is appropriately sized for the complexity of the query language.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema and the presence of sibling tools, the description provides sufficient context: how to invoke, what parameters mean, when to choose it over alternatives, and a note on output size. It does not need to explain return values because no output schema is provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has no parameter descriptions, so the description carries the burden. It explains query is KQL with specific fields and operators, explains folder scoping, and explains concise=True reduces output. Count and cursor are not explained but are standard; cursor is not mentioned. Overall, it adds significant meaning to most parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it performs full-text search on mail using KQL, with scope across all folders or a specific one. It provides an example and distinguishes from outlook_list_inbox by noting that tool is for structured filters in a single folder.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use this for "find emails about X"; use outlook_list_inbox for structured filters scoped to a single folder,' and explains the query syntax, including operator case sensitivity and behavior of multiple terms, giving clear guidance on when and how to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_send_draftB
Destructive

Send an existing draft (pair with outlook_create_draft for human-review send flow).

ParametersJSON Schema
NameRequiredDescriptionDefault
draft_idYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true, so the agent knows this is a mutating, irreversible action. The description adds the human-review flow context, which is mildly useful, but says nothing about what happens to the draft after sending (removal, move to Sent) or delivery side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence, front-loaded with the action and resource, with the workflow hint trailing. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, no-output-schema tool with safety annotations already present, the essentials are covered. Missing: sourcing of draft_id and the post-send disposition of the draft, which would make it fully self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter exists and schema coverage is 0%, so the schema itself says nothing about draft_id. The description also omits where draft_id comes from (create_draft or list_drafts), leaving the agent to infer it; the parameter name is largely self-explanatory, so this is a moderate gap rather than a severe one.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Send') and resource ('an existing draft'), which cleanly separates it from outlook_create_draft (makes the draft) and outlook_send_message (composes and sends directly). Clear purpose, though it doesn't explicitly name those siblings as alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical 'pair with outlook_create_draft for human-review send flow' implies the intended workflow and hints at when this tool is appropriate. It does not state when to prefer it over outlook_send_message, nor any prerequisite that the draft must already exist.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_send_messageA
Destructive

Send an email immediately, no human review.

For human-review workflows use outlook_create_draft + outlook_send_draft instead. For replying to an existing message use outlook_reply; for calendar invites use outlook_rsvp. Pass reply_to to route recipient replies to a different address (e.g. a shared team alias).

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNo
toYes
bccNo
bodyYes
is_htmlNo
subjectYes
reply_toNo
importanceNonormal
request_read_receiptNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation/safety profile is partly covered. The description adds genuine context beyond that: 'no human review' conveys that this is an irreversible, immediately-dispatched action with no approval gate. It does not mention auth requirements, rate limits, or whether the sent message can be recalled, so it stops short of full disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the riskiest fact (immediate, no review) before the routing guidance. Every sentence is actionable and none restates the tool name or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive send tool with no output schema, the description covers the key agent decisions: when to use it versus drafts/reply/rsvp and how to control reply routing. It omits what the call returns (e.g. message id) and whether the send is recallable, which are minor given the absence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the parameter burden. It adds real meaning for reply_to ('route recipient replies to a different address, e.g. a shared team alias'). However, it says nothing about is_html, importance (which has no enum, so valid values are undocumented), or request_read_receipt, leaving several non-obvious parameters unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb (send) and resource (email) and adds the critical scope qualifier 'immediately, no human review'. It is immediately distinguishable from the many sibling tools that create drafts or reply to messages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternatives for the two most likely confusions: outlook_create_draft + outlook_send_draft for human-review workflows, outlook_reply for replies, and outlook_rsvp for calendar invites. Each routing condition is stated, not implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_send_with_attachmentsA
Destructive

Send an email with file attachments; auto-switches to upload-session for files >3MB.

attachment_paths resolve inside the configured attachments directory (attachments_dir, an attachments folder in the settings directory by default) — a bare filename is looked up there, and a path outside it is refused. Pass reply_to to route replies to a different address.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNo
toYes
bccNo
bodyYes
is_htmlNo
subjectYes
reply_toNo
importanceNonormal
attachment_pathsYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is covered. The description adds non-obvious operational context: the >3MB upload-session fallback and the attachments_dir sandboxing that refuses paths outside the configured directory. It does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences that front-load the core action and the size-based fallback before the path constraint. No filler, though the parenthetical directory defaults add some length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists and annotations carry the mutation profile, so the description's job is the operational detail, which it partially delivers. It omits the meaning of is_html/importance defaults and address-list semantics for to/cc/bcc, leaving gaps an agent must guess at.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% across 9 parameters, so the description must compensate. It does valuable work on attachment_paths (resolution root, default location, out-of-root refusal) and reply_to (reply routing), but leaves to, cc, bcc, body, is_html, and importance entirely undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Send an email with file attachments'), which inherently distinguishes it from outlook_send_message and the draft tools by the attachment capability. It does not explicitly name a sibling alternative, but the resource is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives conditional behavior (auto-switches to upload-session for files >3MB) and path-resolution rules that affect correct invocation. However, it never says when to prefer this over outlook_send_message, outlook_create_draft, or outlook_attach_to_draft, leaving alternative selection to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_set_inbox_overrideA
Idempotent

Create or update a sticky Focused/Other rule for a sender (upsert, case-insensitive).

Use this to permanently change classification for FUTURE messages from a sender; use outlook_reclassify_message to fix ONE existing message.

Example: outlook_set_inbox_override(sender_email="marketing@acme.com", classify_as="other") Returns status: "created" or "updated".

ParametersJSON Schema
NameRequiredDescriptionDefault
classify_asYes
sender_emailYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false; the description reinforces this with upsert/case-insensitive semantics and the persistence scope (future messages). It also discloses the return status values ('created' or 'updated'), which annotations do not cover. It stops short of auth or rate-limit context, but the safety profile is well grounded.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences plus a worked example, front-loaded with the core action before the alternative-tool routing. Every element earns its place, and the example is high-value given the zero schema coverage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, but the description supplies the return status inline. The only real gap is the missing enumeration of classify_as values, which is notable for a required param with no schema description or enum. Otherwise complete for a two-parameter upsert tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the load. The example demonstrates sender_email and the case-insensitive behavior, and 'Focused/Other rule' hints at classify_as values, but it never enumerates the accepted classify_as inputs, leaving a required parameter with no enum under-specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create or update a sticky Focused/Other rule for a sender') and clarifies the upsert semantics and case-insensitivity. It explicitly names the sibling it differs from (outlook_reclassify_message), so an agent can route without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use ('permanently change classification for FUTURE messages') and a named alternative with the contrasting condition ('use outlook_reclassify_message to fix ONE existing message'). Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_update_checklist_itemA
Idempotent

Update a checklist item (partial patch — only provided fields change).

is_checked=True marks a sub-step done; Graph maintains the checked timestamp from it. Renaming passes display_name.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idNo
task_idYes
is_checkedNo
display_nameNo
checklist_item_idYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false). The description adds genuine behavior beyond that: only supplied fields change, and Graph maintains the checked timestamp when is_checked=True. It omits any auth or error-handling detail, but the added context is substantive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very short and front-loaded — the mutation semantics lead, followed by the two field-specific notes. No filler, though the line-break formatting is slightly ragged for such a brief text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema and 0% parameter coverage mean the description carries the burden. It covers the patch model and the two mutable fields well but says nothing about the ID parameters' relationships or what a successful call returns, leaving real gaps for a 5-param tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across five parameters, so the description must compensate. It explains is_checked and display_name meaningfully, but list_id, task_id and checklist_item_id are left undocumented beyond their names. Partial compensation only.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Update a checklist item') and immediately qualifies the semantics as a partial patch. This distinguishes it from add/delete checklist item siblings, though it never names them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical 'partial patch — only provided fields change' tells the agent how to invoke it (supply only the fields to alter), and the follow-on sentences clarify the two mutation modes. No explicit when-not or sibling routing, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_update_contactA

Update an existing contact (partial patch — only provided fields change).

An address takes the shape outlook_get_contact returns — any subset of {"street", "city", "state", "postal_code", "country_or_region"} — and REPLACES that whole address, so pass back every part you want to keep. Omit it to leave it untouched.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailNo
phoneNo
last_nameNo
contact_idYes
first_nameNo
home_addressNo
other_addressNo
business_addressNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false. The description goes beyond that with a genuinely important behavioral warning: an address argument REPLACES the whole address object, so omitted parts are lost, and omitting the parameter entirely leaves it untouched. That kind of destructive-by-omission risk is exactly the context annotations don't carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the core contract front-loaded and the address gotcha called out in caps for emphasis. No filler, though the address explanation runs slightly long relative to the total content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter mutation tool with no output schema and minimal annotations, the description covers only the address subset. It omits what happens with an invalid contact_id, whether required fields can be nulled, and the semantics of the scalar fields, leaving real gaps an agent would need filled.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 8 parameters, so the description must compensate and only partly does. It fully documents the three address parameters (shape and replace-vs-omit semantics) but says nothing about email, phone, first_name, or last_name, nor explains the required contact_id.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update an existing contact') and immediately qualifies it with partial-patch semantics, so an agent knows this is a mutation tool, not a create/delete/get. It does not explicitly contrast with sibling update_* tools, but the resource is unambiguous from name and text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the invocation contract (omit a field to leave it untouched) which is genuinely useful, but it never states when to reach for this tool versus alternatives like outlook_create_contact, outlook_get_contact, or outlook_delete_contact. Usage is implied by the patch semantics rather than laid out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_update_draftA

Update an existing draft (partial patch).

Pass is_html=True when body is HTML — required when overwriting a draft originally composed as HTML (consumer Outlook rejects Text-over-HTML PATCH). Pass reply_to=[...] to overwrite Reply-To; reply_to=[] to clear it. Pass deferred_send_datetime (ISO 8601) to set the scheduled-send time; empty string clears it.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNo
toNo
bodyNo
is_htmlNo
subjectNo
draft_idYes
reply_toNo
deferred_send_datetimeNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate this is a write, non-destructive operation. The description adds important behavioral context: the partial patch behavior, the requirement for is_html=True when overwriting HTML drafts, and how to set or clear reply_to and deferred_send_datetime. This goes beyond annotations and helps the agent understand edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise—only four lines—and each sentence serves a distinct purpose. The purpose is front-loaded, and the subsequent lines provide critical parameter guidance without unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 8 parameters (1 required) and no output schema, the description covers key parameter behaviors and constraints. However, it does not mention what the tool returns (likely the updated draft) or error conditions. Still, it provides enough context for correct invocation in most scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by explaining the semantics of is_html, reply_to, and deferred_send_datetime. While other parameters (to, cc, body, subject) are not elaborated, they are standard email fields and require less explanation. The description adds value for the most nuanced parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as updating an existing draft via a partial patch. The verb 'update' and resource 'draft' are explicit, and it distinguishes from siblings like outlook_create_draft, outlook_send_draft, and outlook_delete_draft.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides specific usage conditions for key parameters (is_html, reply_to, deferred_send_datetime), which guides correct invocation. However, it lacks explicit guidance on when to use this tool versus alternative draft-related tools, though the purpose implicitly handles that.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_update_eventA
Destructive

Update fields on an existing event (partial patch — only provided fields change).

recurrence takes the same shapes as outlook_create_event and converts a single event into a series, or replaces an existing series' pattern. Omit it to leave any recurrence alone; pass remove_recurrence=True to turn a series back into a single event, keeping the first occurrence's time (the two are mutually exclusive). attendees REPLACES the whole guest list (Graph has no add-one operation) and sends invitations to everyone on it plus cancellations to anyone dropped — pass the full intended list; [] removes everyone. is_all_day REQUIRES start and end in the same call, both on midnight boundaries. Patching a time keeps the zone the event is anchored in; pass timezone (with start and end) to re-anchor it somewhere else. A start, end or recurrence patch to a series with edited or deleted occurrences is refused, since Graph would discard them. Omitting an argument leaves it unchanged, so False and [] are instructions, not absences. show_as is Outlook's "Show as" — same values as outlook_create_event — and patches on its own; unlike is_all_day it needs nothing resent alongside it.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNo
bodyNo
startNo
show_asNo
subjectNo
event_idYes
locationNo
timezoneNo
attendeesNo
is_all_dayNo
recurrenceNo
remove_recurrenceNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=true; the description adds far more, disclosing that `attendees` replaces the entire guest list and triggers invitations plus cancellations, that a time patch preserves the event's anchor zone unless `timezone` is passed, and that start/end/recurrence patches to a series with edited or deleted occurrences are refused. It also clarifies the dangerous ambiguity that False and [] are instructions rather than absences. This is exactly the side-effect disclosure a destructive mutation needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The text is long but dense and front-loaded, with the core partial-patch rule first and backticked parameter names aiding scanning. The closing note that omitted arguments stay unchanged overlaps slightly with the opening 'only provided fields change' line, though it earns its place by clarifying that False and [] are explicit instructions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter destructive mutation with no output schema, the description covers the risky semantics thoroughly. The main residual gap is that it never says where an event_id comes from (outlook_list_events / outlook_get_event) or what the call returns, which matters slightly given there is no output schema to fall back on.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 12 parameters, so the description carries the full burden and largely discharges it: it explains `recurrence` shapes and its relationship to outlook_create_event, `remove_recurrence` semantics, `attendees` replace-not-append behavior, `is_all_day`/`start`/`end` coupling, `timezone` re-anchoring, and `show_as` values. The remaining undocumented parameters (event_id, subject, body, location) are self-evident by name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence gives a specific verb (update), resource (existing event) and scope (partial patch — only provided fields change), which is exactly the semantic an agent needs to separate it from outlook_create_event and outlook_delete_event. The sibling tools list contains all three, and the description makes the boundary unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit conditional routing: omit `recurrence` to leave it alone, pass `remove_recurrence=True` to revert to a single event, and notes the two are mutually exclusive. It also states that `is_all_day` requires start+end together while `show_as` patches alone. It stops short of naming sibling tools to call for adjacent tasks (e.g. rsvp, delete_event), so no explicit when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_update_taskA

Update fields on a To Do task (partial patch — only provided fields change).

ParametersJSON Schema
NameRequiredDescriptionDefault
dueNo
bodyNo
titleNo
list_idNo
task_idYes
importanceNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false (write operation) and destructiveHint=false (not destructive). The description adds 'partial patch' context, indicating only provided fields change, which is a key behavioral trait beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with 12 words, front-loaded with the action and resource, no wasted words. Efficient and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 6 parameters and no output schema, the description lacks information on return values, error cases, or field constraints (e.g., date formats, importance levels). Incomplete for an update operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for 6 parameters. The description provides no additional meaning for any parameter, leaving agents to infer from names alone (e.g., 'due', 'body'), which is insufficient for reliable invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Update', the resource 'To Do task', and the important nuance 'partial patch — only provided fields change'. This distinguishes it from create and delete siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for updating specific fields but does not explicitly state when to use this tool versus alternatives like outlook_create_task or when not to use it (e.g., for full replacement). No prerequisites or exclusion criteria are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_upload_task_attachmentA

Attach a local file to a To Do task via inline base64 POST (1 byte – 20 MiB).

file_path resolves inside the configured attachments directory. Larger files are refused up front: Graph caps the request body at 30 MB and base64 inflates the file 4/3, so 20 MiB is the honest ceiling.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idNo
task_idYes
file_pathYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say this is a non-read-only, non-destructive write. The description goes well beyond that: it discloses the inline base64 POST mechanism, the resolution scope of file_path (inside the configured attachments directory), and the 20 MiB ceiling with the reasoning (30 MB Graph body cap, 4/3 base64 inflation) and the up-front refusal behavior. Auth requirements and return payload are not covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action in the first clause, followed by the size bound. The second paragraph explaining the 30 MB/4-3 rationale is slightly verbose but earns its place by making the ceiling credible rather than arbitrary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so return values need not be described, but the description also says nothing about what happens on success or failure beyond size refusal. With two of three parameters undocumented and no annotation detail on write behavior, it is adequate but leaves real gaps for a write tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden. It explains file_path semantics (resolves inside the configured attachments directory) and the size constraint tied to it, which is genuinely useful, but task_id and list_id go entirely undocumented beyond their self-evident names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope: 'Attach a local file to a To Do task.' The 'To Do task' qualifier implicitly separates it from mail/draft attachment siblings such as outlook_attach_to_draft and outlook_send_with_attachments, but no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the name and the size ceiling acts as a de facto precondition, but there is no explicit when-to-use guidance and no stated alternative for attaching to mail vs. tasks. An agent must infer the routing from the sibling list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outlook_whoamiA
Read-only

Get the authenticated user's profile (display name, email, ID).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true. The description adds the specific return fields, which is useful but not deep behavioral context. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with front-loaded verb and essential information. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only identity tool, the description is complete enough. It could mention 'no input required', but not necessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, and schema coverage is 100%. The description confirms the tool takes no input, which is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Get' and resource 'authenticated user's profile', listing key fields (display name, email, ID). This clearly distinguishes it from sibling tools, which focus on emails, events, contacts, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage to retrieve current user info. No explicit when-not or alternatives are given, but given the unique purpose among siblings, the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev1.23.0
    • Changedoutlook_update_event1 field changed
      • addedInput schema / properties / timezone
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Timezone"
        +}
  2. 14 tool updatesv1.22.1
    • Addedoutlook_add_checklist_item
    • Changedoutlook_create_event2 fields changed
      • addedInput schema / properties / show_as
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Show As"
        +}
      • addedInput schema / properties / timezone
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Timezone"
        +}
    • Addedoutlook_delete_checklist_item
    • Addedoutlook_delete_task_attachment
    • Addedoutlook_download_task_attachment
    • Addedoutlook_get_task
    • Removedoutlook_list_accounts
    • Changedoutlook_list_events1 field changed
      • addedInput schema / properties / calendar
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Calendar"
        +}
    • Addedoutlook_list_task_attachments
    • Removedoutlook_switch_account
    • Addedoutlook_update_checklist_item
    • Changedoutlook_update_contact3 fields changed
      • addedInput schema / properties / business_address
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Business Address"
        +}
      • addedInput schema / properties / home_address
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Home Address"
        +}
      • addedInput schema / properties / other_address
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Other Address"
        +}
    • Changedoutlook_update_event1 field changed
      • addedInput schema / properties / show_as
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Show As"
        +}
    • Addedoutlook_upload_task_attachment
  3. 3 tool updatesv1.19.0
    • Changedoutlook_create_event1 field changed
      • changedInput schema / properties / recurrence / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedoutlook_send_message1 field changed
      • removedInput schema / properties / sensitivity
        Removed value: -{
        -  "default": "normal",
        -  "title": "Sensitivity",
        -  "type": "string"
        -}
    • Changedoutlook_update_event4 fields changed
      • addedInput schema / properties / attendees
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Attendees"
        +}
      • addedInput schema / properties / is_all_day
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Is All Day"
        +}
      • addedInput schema / properties / recurrence
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Recurrence"
        +}
      • addedInput schema / properties / remove_recurrence
        Added value: +{
        +  "default": false,
        +  "title": "Remove Recurrence",
        +  "type": "boolean"
        +}
  4. 19 tool updatesv1.14.0
    • Addedoutlook_auth_status
    • Addedoutlook_categorize_message
    • Addedoutlook_complete_task
    • Addedoutlook_delete_message
    • Addedoutlook_delete_task
    • Addedoutlook_flag_message
    • Addedoutlook_forward
    • Addedoutlook_list_drafts
    • Addedoutlook_list_inbox
    • Addedoutlook_list_inbox_delta
    • Addedoutlook_list_inbox_overrides
    • Addedoutlook_mark_read
    • Addedoutlook_move_message
    • Addedoutlook_read_messages
    • Addedoutlook_reclassify_message
    • Addedoutlook_reply
    • Addedoutlook_search_mail
    • Addedoutlook_send_message
    • Addedoutlook_set_inbox_override
  5. 19 tool updatesv1.12.0
    • Removedoutlook_auth_status
    • Removedoutlook_categorize_message
    • Removedoutlook_complete_task
    • Removedoutlook_delete_message
    • Removedoutlook_delete_task
    • Removedoutlook_flag_message
    • Removedoutlook_forward
    • Removedoutlook_list_drafts
    • Removedoutlook_list_inbox
    • Removedoutlook_list_inbox_delta
    • Removedoutlook_list_inbox_overrides
    • Removedoutlook_mark_read
    • Removedoutlook_move_message
    • Removedoutlook_read_messages
    • Removedoutlook_reclassify_message
    • Removedoutlook_reply
    • Removedoutlook_search_mail
    • Removedoutlook_send_message
    • Removedoutlook_set_inbox_override
  6. 62 tool updatesv1.11.0
    • First observedoutlook_attach_to_draft
    • First observedoutlook_auth_status
    • First observedoutlook_batch_triage
    • First observedoutlook_categorize_message
    • First observedoutlook_changes_since
    • First observedoutlook_complete_task
    • First observedoutlook_copy_message
    • First observedoutlook_create_contact
    • First observedoutlook_create_draft
    • First observedoutlook_create_event
    • First observedoutlook_create_folder
    • First observedoutlook_create_task
    • First observedoutlook_delete_contact
    • First observedoutlook_delete_draft
    • First observedoutlook_delete_event
    • First observedoutlook_delete_folder
    • First observedoutlook_delete_inbox_override
    • First observedoutlook_delete_message
    • First observedoutlook_delete_task
    • First observedoutlook_download_attachment
    • First observedoutlook_flag_message
    • First observedoutlook_forward
    • First observedoutlook_get_contact
    • First observedoutlook_get_event
    • First observedoutlook_get_mail_tips
    • First observedoutlook_list_accounts
    • First observedoutlook_list_attachments
    • First observedoutlook_list_calendars
    • First observedoutlook_list_categories
    • First observedoutlook_list_contacts
    • First observedoutlook_list_contacts_delta
    • First observedoutlook_list_drafts
    • First observedoutlook_list_events
    • First observedoutlook_list_events_delta
    • First observedoutlook_list_folders
    • First observedoutlook_list_inbox
    • First observedoutlook_list_inbox_delta
    • First observedoutlook_list_inbox_overrides
    • First observedoutlook_list_task_lists
    • First observedoutlook_list_tasks
    • First observedoutlook_list_thread
    • First observedoutlook_mark_read
    • First observedoutlook_move_message
    • First observedoutlook_read_message
    • First observedoutlook_read_messages
    • First observedoutlook_reclassify_message
    • First observedoutlook_remove_draft_attachment
    • First observedoutlook_rename_folder
    • First observedoutlook_reply
    • First observedoutlook_rsvp
    • First observedoutlook_search_contacts
    • First observedoutlook_search_mail
    • First observedoutlook_send_draft
    • First observedoutlook_send_message
    • First observedoutlook_send_with_attachments
    • First observedoutlook_set_inbox_override
    • First observedoutlook_switch_account
    • First observedoutlook_update_contact
    • First observedoutlook_update_draft
    • First observedoutlook_update_event
    • First observedoutlook_update_task
    • First observedoutlook_whoami

TDQS

B3.3/5.0

Scored across 68 tools

Disambiguation4/5

Many tools are differentiated by scope (single vs batch, delta vs one-shot, individual vs combined digest), and descriptions explicitly cross-reference each other. However, overlaps such as batch_triage vs individual move/flag/categorize/mark_read and multiple list/read/delta variants mean an agent must read descriptions carefully to avoid misselection.

Naming Consistency4/5

Names use a consistent snake_case convention with an `outlook_` prefix and mostly follow a verb_noun pattern (list_events, create_task, delete_folder). A few exceptions (auth_status, whoami, changes_since) slightly break the verb_noun pattern, but overall readability and predictability are high.

Tool Count1/5

68 tools is far beyond the typical 3-15 range and exceeds the 50-tool threshold for extreme mismatch. Even though the server covers a broad domain, the sheer count creates a large selection and context burden for an agent.

Completeness4/5

The surface covers mail, calendar, contacts, tasks, folders, attachments, drafts, focused inbox, and delta sync with strong CRUD coverage across these areas. Some secondary Outlook operations are missing (e.g., category management, calendar creation, out-of-office settings), but core agent workflows have no obvious dead ends.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    22 consolidated MCP tools for email, calendar, contacts, folders, rules, categories, and settings with safety controls (dry-run preview, rate limiting, recipient allowlists) and MCP annotations on every tool. Works with personal Outlook.com and work/school Microsoft 365 accounts.
    8
    22
    1,644 npm
    39
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Comprehensive MCP server for local Microsoft Outlook automation, providing 64 tools across email, calendar, contacts, tasks, notes, and Exchange features on both Windows and macOS.
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for sending and managing Microsoft Outlook email via the Microsoft Graph API, including drafts, replies, contacts, and directory search.
    134 npm
    MIT