outlook-mcp
Summary: outlook-mcp is a typed MCP server for personal Microsoft Outlook accounts that lets an agent read, triage, write, schedule, and track mail, calendar, contacts, tasks, drafts, attachments, and folders through Microsoft Graph.
Check authentication status, current user, calendars, categories, and mail tips.
Read mail: list/read/search messages, browse folders, read threads, bulk-read by ID, delta-sync inbox changes, and get a combined mail/calendar/contacts "since last call" digest.
Send and respond: send email, reply/reply-all, forward, create/update/send drafts, schedule draft delivery, and send with attachments.
Triage mail: move, copy, delete, flag, categorize, mark read/unread, reclassify Focused Inbox, manage sender overrides, and batch-triage messages.
Manage mail folders: list recursively, create, rename, and delete folders.
Calendar: list/get/find events, delta-sync events, create/update/delete events, create recurring series, RSVP, and attach/remove event files.
Contacts: list, search (including by phone), get, create, update, delete, and delta-sync contacts.
To Do: list task lists, manage tasks, complete tasks, manage checklist items, and handle task attachments.
Attachments: list/download message attachments, attach files to drafts/events/tasks, upload task attachments, and remove attachments.
Opt-in per README: inbox rules and PDF/XLSX/text attachment reading.
Safety controls: read-only mode, granular write categories, attachment access confined to
attachments_dir, OS keyring token storage, and optional authenticated HTTP transport.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@outlook-mcpShow me my unread emails from today"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
outlook-mcp
MCP server for Microsoft Outlook personal accounts via Microsoft Graph API.
Personal Microsoft accounts only —
@outlook.com,@hotmail.com,@live.com. Work/school accounts (Entra ID) are not supported: the server is built and tested on personal accounts. Fixes that make a tool behave on a work account, without changing what a personal account sees, are welcome.
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, optionalread_onlymode, 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 76 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 and calendar events.
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 76 discrete tools (71 load by default; the four rule tools and the document reader are opt-in) so the agent can compose its own workflow — read, triage, write, schedule, track tasks — without hardcoded macros.
Works With
Claude Code —
claude mcp add outlook -- outlook-mcpCursor — MCP-compatible
Any MCP client — it's a standard stdio MCP server, with an opt-in streamable-HTTP transport for clients that cannot spawn a local process
Listed on the official MCP Registry as io.github.mpalermiti/outlook-mcp.
What's new
The last few releases, in brief. Every change is in the CHANGELOG.
Inbox rules (1.30): list, create, change and delete server-side inbox rules, and see what each rule leaves out (1.30.2). Off unless you turn it on, and a rule that forwards mail also needs send permission.
Attachments as text (1.28): PDFs, spreadsheets and text files come back as readable text, parsed in a separate process with memory and time limits. Off unless you turn it on.
Calendar (1.27–1.29): turn a meeting invitation into its calendar event, attach files to events, tag an event so you can find it again, create events in any of your calendars, and see who owns each calendar.
Mail (1.27–1.28): write in Markdown, and replies keep their formatting and the quoted original. Start a draft as a reply or forward, name folders by path (
Inbox/Travel/Flights), and see whether Microsoft verified a sender.Contacts (1.26–1.27): job title, phone types, birthday, notes, middle name and categories, and search by phone number however it's written.
Remote clients (1.27–1.28): an optional HTTP mode serves a client on another machine and refuses to start without a token. Downloads can come back in the reply instead of as a file on the server.
Safer sends (1.27–1.28): a send that times out is never sent twice on its own, and a large attachment that fails to upload no longer lets the mail go without it.
Accounts and settings (1.29): pin a server to one sign-in, and set options from environment variables, which can only tighten security.
Cheaper every turn (1.29): the tool list every client reads on each turn is a quarter smaller, and features that would add to it are off by default.
Features
76 tools across 14 categories. 71 load by default; the four rule tools and the document reader are opt-in groups (see Toolset selection).
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/contactsMail 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
Mail Rules (4) -- list rules in execution order, create from sender/subject/body conditions, update (reads the rule first, so other actions survive a re-point), delete — opt-in toolset group
Calendar Read (4) -- list events (with recurring expansion), get event details, find events by key, delta-sync event changes
Calendar Write (6) -- create, update, delete, RSVP (accept/decline/tentative), attach and remove event files
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 (new, or a reply, reply-all or forward in the message's thread), update, send, delete
Attachments (6) -- list, download, read document text (opt-in), 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: truein config to block all write operations. Note this limits the tools, not the token -- see Whatread_onlydoes 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:
7dis seven days ago,+7dis seven days from now,nowis 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_tokenis caller-held state, so it is untrusted input. Every URL that would carry a Graph bearer token is parsed and required to be https ongraph.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_folderandcatch_upship 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 tools cheaper and more recoverable for AI agents:
Concise mode — pass
concise=Trueto the six high-volume read tools (outlook_list_inbox,outlook_read_message,outlook_read_messages,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×. Onoutlook_list_eventsthe trade is different and smaller:organizer,response_status,type,show_asandkeycome off,is_organizerandattendees_countare added, andis_onlineis spelledis_online_meeting, so a concise scan cannot tell a recurring occurrence from a one-off. Defaultconcise=Falsepreserves the existing response shape — strict backward compat.Structured Graph errors — every tool turns msgraph SDK exceptions into a tool error whose text carries Graph's message and a recovery hint: 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 — except on the tools that can email someone (mail, invitations, event updates, RSVPs), where a 5xx says the write may already have gone through and where to check, because those writes are never re-sent after one.OutlookMCPErrorsubclasses 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:
Go to azure.microsoft.com/free and sign up with your personal
@outlook.comaccount. Requires a credit card for identity verification but won't charge you. This creates a proper Azure AD tenant.
Register the App
Go to App Registrations and sign in with your
@outlook.comaccount.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
Click Register. Copy the Application (client) ID from the overview page.
Go to Authentication (Preview) → Settings tab → toggle "Allow public client flows" to Yes → Save.
Go to API permissions → Add a permission → Microsoft Graph → Delegated permissions → add:
Mail.ReadWrite,Mail.SendCalendars.ReadWriteContacts.ReadWrite,Tasks.ReadWriteMailboxSettings.ReadUser.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-mcpTo read PDF and XLSX attachments as text, install the optional documents extra instead
(uv tool install 'outlook-graph-mcp[documents]') and enable the opt-in documents group;
see Attachments.
Option B — from source:
git clone https://github.com/mpalermiti/outlook-mcp.git
cd outlook-mcp
uv syncConfigure
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 --jsonRestart 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:
outlook-mcp auth # installed from PyPI
uv run outlook-mcp auth # from a source checkoutYou'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) — with mailbox_settings_write: true the settings scope becomes MailboxSettings.ReadWrite — 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 (prefix uv run from a source checkout):
outlook-mcp status # Check auth status
outlook-mcp logout # Remove this instance's auth record (the OS token cache is left to age out)
outlook-mcp serve # Start MCP server (default; stdio, or HTTP with OUTLOOK_MCP_TRANSPORT)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 1.5.1 doesn't 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). In 1.26.0 that cap is replaced by a msgraph-core>=1.5.2 floor, which carries the fix and works with kiota 1.13+:
uv tool upgrade outlook-graph-mcp
# or: pipx upgrade outlook-graph-mcp
# or: pip install --upgrade outlook-graph-mcpYour 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 authThe 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)
On Linux without an encrypted store (libsecret/PyGObject not importable, or no running Secret Service), outlook-mcp auth and the server refuse to write the token cache in cleartext, and every tool call says why. Install the system packages for an encrypted store — see Privacy and Security — or set allow_unencrypted_token_cache: true to accept a plaintext cache file, after which the server logs a one-time warning at startup.
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.
Folders. Every folder argument, outlook_create_folder's parent_folder and
outlook_batch_triage's move target take a well-known name (inbox, junkemail), a display
name (Junk Email), a Graph ID, or a path: Inbox/Travel/Flights is Flights under Travel under
Inbox. A / inside a folder's own name is written // (Inbox/Q1//Q2). A display name finds a
top-level folder of that name first; a name that several nested folders share is refused, and
the error lists their paths. outlook_rename_folder and outlook_delete_folder take an ID.
Auth
Tool | Description |
| 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 |
| List messages in a folder. |
| Get full message by ID, or by its Message-ID header value ( |
| Bulk read up to 20 messages by ID via Graph |
| Search mail using KQL query. Optionally scope to a folder by name, path or ID. A |
| List mail folders with counts, |
| List only inbox changes since the last call. |
| One structured "since last call" digest composing mail/events/contacts deltas. Returns counts + |
Mail Write
Tool | Description |
| Send email. Supports TO/CC/BCC, HTML or Markdown body, importance level, |
| Reply or reply-all to a message, the text above the quoted original. Plain text keeps its paragraphs, line breaks and |
| Forward a message to one or more recipients with optional comment, which keeps its line breaks like a reply's text. |
Bodies are plain text unless is_html=True (HTML, sent as written) or is_markdown=True. Markdown is converted to HTML for a safe subset: paragraphs, line breaks, -/*/+ and numbered lists, **bold**, *italic*, `code`, and [text](url) links to https: and mailto: addresses only. An image, , becomes a link to it, never an embedded picture. Everything else, raw HTML included, is shown as written. outlook_send_message, outlook_reply, outlook_forward (its comment), outlook_create_draft and outlook_update_draft take it; on a plain-text thread a Markdown reply is sent as written, as plain text.
Mail Triage
Tool | Description |
| Move a message to a folder by name, path or ID. |
| Delete a message. Soft delete (Deleted Items) by default. |
| Set follow-up flag: |
| Set categories on a message. |
| Mark a message as read or unread. |
| Move a message between Focused Inbox and Other ( |
| List Focused Inbox per-sender override rules. |
| Upsert a per-sender Focused Inbox override ( |
| Delete a Focused Inbox override by ID. |
Mail Rules
Server-side rules: they run whether or not any Outlook client is open. A rule is durable, not a one-off — create one and it keeps applying to all future mail long after the agent that made it has disconnected. That is what makes rules useful, and it is also why outlook_create_rule and outlook_update_rule are annotated destructive — re-enabling one resumes whatever it does — and why forward_to, and re-enabling a rule that forwards or redirects, additionally require the mail_send category: a forwarding rule keeps mailing a third party after the session ends, which is the standard way a compromised mailbox gets drained. Hard delete is not offered here — delete moves matching mail to Deleted Items, which is recoverable. The same mail_send gate covers the indirect routes to a forwarding rule starting work: reordering one, or disabling, reordering or deleting a stop_processing_rules or permanentDelete rule that was hiding it — permanentDelete removes the message before later rules see it. Repairing an errored forwarding rule needs mail_send too: the repair puts it back into service. And a listing that stopped early (complete: false) counts as "cannot tell", so it gates the same way rather than assuming nothing is hidden. A rule that never runs until the rule above it changes is still a rule that forwards mail.
Tool | Description |
| List inbox rules in execution order, with conditions, exceptions and actions, and whether Exchange reports an error applying the rule. |
| Create a rule from sender/subject/body/attachment conditions and move, copy, mark-read, delete, forward, categorize or stop-processing actions. |
| Change a rule's name, enabled state, sequence, target folder or mark-read action. Other actions are preserved; re-enabling a rule that forwards or redirects needs |
| Delete a rule by ID. Irreversible. |
The three write tools are gated by the mail_rules permission category — add it to allow_categories (or leave allow_categories unset for a full read-write install).
The four rule tools are opt-in, off in a stock install: with OUTLOOK_MCP_TOOLSETS unset none of them is loaded — not even outlook_list_rules — and the surface every user pays for is unchanged. Name rules in OUTLOOK_MCP_TOOLSETS to load them, or set mailbox_settings_write: true, which adds them only when OUTLOOK_MCP_TOOLSETS is unset — an explicit selection is what you asked for, so it wins.
A rule hides as well as forwards, and the hiding needs no permission beyond mail_rules: a rule at sequence 1 that deletes, marks read and stops processing on "security", "sign-in" or "password" removes that mail before any later rule sees it. Read the rules of a mailbox you did not configure before trusting what it shows you.
Not every personal mailbox allows rules. One answered all four operations; another refused even a plain listing with 403, though its token reads categories under the same MailboxSettings.Read scope. A refused listing says it is either the consent or the mailbox. If a fresh sign-in does not change it, rules cannot be managed there.
Order is Graph's to set. On a live personal mailbox, sequence was ignored on both create and update: a rule created at sequence 500 and then patched to 500 stayed at the sequence Graph had assigned (128 of 127). The tools accept the field because Graph's schema does, and they return the sequence Graph actually stored — treat that returned value as authoritative, not the one you asked for. When the two differ, the reply also carries sequence_requested, so an ignored request is visible. The ordering and tie logic in the mail_send gate is defensive against a listing that reports equal or missing sequences, not something this API was observed to produce.
Creating, updating or deleting a rule also needs MailboxSettings.ReadWrite on the token. The default read-write consent set requests MailboxSettings.Read only, so the write tools answer ErrorAccessDenied until the token carries the scope. To enable the write tools:
Ask for the write scope at sign-in. Set
mailbox_settings_write: truein your config. The default read-write consent asks forMailboxSettings.Readonly, so without this every rule write answersErrorAccessDeniedno matter what the app registration allows.Re-run
outlook-mcp auth. Consent is granted per requested scope and an existing token keeps the scopes it was issued with, so the new scope only lands on a fresh consent.Restart the server. Tools are chosen when the process starts, so the rule tools appear only after a restart — a config change mid-session does nothing to the surface, and the write scope alone does not add them.
If your tenant restricts it, add
MailboxSettings.ReadWrite(delegated, Microsoft Graph) to the app registration in the Azure portal and grant admin consent before step 2. A personal account does not need this.
outlook_mcp cannot detect a half-configured setup: a token without the scope authenticates fine and reads keep working, and every rule write fails at Microsoft's end with ErrorAccessDenied. If rule writes fail while outlook_list_rules works, the scope is the cause.
Calendar Read
Tool | Description |
| List events in a date range. Expands recurring events. Each event carries |
| Get full event details: attendees, body, online meeting URL, recurrence, |
| Find the events whose |
| List only event changes inside a window since the last call. |
Calendar Write
Tool | Description |
| Create event with location and attendees. ( |
| Update event fields (subject, time, location, body, attendees, all-day, |
| Delete a calendar event. |
| RSVP to an event: |
| Attach files to an event — an e-ticket on a flight, say. |
| Remove one attachment from an event, by the ID |
Contacts
Tool | Description |
| List contacts with cursor pagination. Summaries carry |
| Search contacts by name or email. |
| Get full contact details by ID, including |
| Create a new contact. |
| Update contact fields, including |
| Delete a contact. |
| List only contact changes since the last call. Deletes come back as |
To Do
Tool | Description |
| List To Do lists. |
| List tasks with status filter and pagination. |
| Get full task details: notes ( |
| Create task with due date, importance, recurrence. |
| Update task fields. |
| Mark task as completed. |
| Delete a task. |
| Add a checklist item (sub-step) to a task. |
| Update a checklist item — mark done ( |
| Delete a checklist item from a task. |
| List attachments on a To Do task (id, name, size, content_type) with pagination. |
| Download a task attachment's content to a local file (confined to |
| Attach a local file (from |
| Remove an attachment from a To Do task. |
Drafts
Tool | Description |
| List draft messages with pagination. |
| Create a draft, with an HTML ( |
| Update draft fields. Accepts |
| Send an existing 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 widenattachments_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 fromattachments_dirand downloads write into it, so neither can sweep arbitrary files off disk. (Downloads are nottodo_write-gated — they are reads, likeoutlook_download_attachment; the fence, not the category, is what confines them.)A client that can't see the server's disk, such as a remote or sandboxed one, can carry the bytes in the call instead, and then nothing is read from or written to disk.
as_content=Trueon either download returns the attachment in the result, up to 10 MB: PNG, JPEG, GIF and WebP up to 5 MB as images, text up to 100,000 characters as text, and anything else, PDFs included, as an embedded resource holding the base64 bytes and their type. An image cut short (a PNG with no end chunk, say) comes back as that resource too. Text that carries control characters, or a lone surrogate its charset decoded to, also comes back as that resource, so it arrives unaltered.attachmentsonoutlook_send_with_attachmentsandoutlook_attach_to_drafttakes inline files,[{name, content_base64, content_type?}], up to 3 MB each (Graph's simple-attachment size). The fence still governs every path argument. An inline file is bytes the agent already holds and could already put in a message body, so it widens nothing.outlook_attach_to_eventandoutlook_upload_task_attachmenttake paths only.
Tool | Description |
| List attachments on a message. |
| Download an attachment and save decoded bytes into |
| Opt-in ( |
| Send a message with attachments read from |
| Add attachments from |
| Remove a single attachment from a draft. |
For readable document contents rather than original bytes, use outlook_read_attachment.
The saved path from a download belongs to the server, so a remote client may not be able to open it.
as_content=True avoids that path and preserves the original file; the reading tool instead returns
extracted text for clients that cannot interpret the embedded binary resource. Existing downloads
and their defaults are unchanged.
PDF and XLSX parsing is optional: install outlook-graph-mcp[documents] (for example,
uv tool install 'outlook-graph-mcp[documents]', pipx install 'outlook-graph-mcp[documents]',
pip install 'outlook-graph-mcp[documents]', or uv sync --extra documents in a source
checkout). Enable the opt-in documents group with
OUTLOOK_MCP_TOOLSETS=mail,attachments,documents (plus any other groups you need) and restart.
Naming groups loads only those, so list every group you want; see
Toolset selection.
When enabled, a base install can read text in its declared charset (UTF-8 by default),
and returns an installation hint for PDF/XLSX. Parser dependencies have bounded versions
and are imported only in a short-lived worker; they add no requirement to the base install.
outlook_read_attachment(message_id, attachment_id, offset=0, max_chars=20000) returns text,
next_offset (null at the end), total_chars, file bytes / sha256, and warnings. Continue with
the same IDs and the returned offset until null. Each continuation downloads and parses the
whole file again, then returns the requested slice; there is no document cache. Use a larger
max_chars (up to 50000) to reduce repeated work. PDF output marks page numbers; a page without a
text layer is reported as blank or needing OCR. Extracted PDF text lines are prefixed with
| , so only the PDF reader can emit an unprefixed [Page N] structural marker in PDF output.
This guarantee is PDF-only: XLSX and text chunks can start mid-cell or mid-line, and apparent
cell addresses or page markers in their contents are untrusted text. No OCR is performed. XLSX output includes hidden
sheets, cell addresses, number formats, formulas and saved_result (Excel's stored value, null when
absent). Formulas are not recalculated, and charts/images are not extracted. All attachment
contents remain untrusted data.
Worksheet metadata (sheets) is returned only at offset 0, and only when its serialized list
plus at least one text character fits max_chars; otherwise the list is omitted and worksheet
names remain in the paged text. A workbook above 100 sheets is refused; displayed sheet names
are cut to Excel's 31-character limit, with … [N] marking a cut name and its one-based
worksheet position so shared prefixes remain distinguishable. Names within the limit are unchanged.
max_chars budgets text plus serialized worksheet metadata;
the fixed response envelope and bounded warnings are separate. A PDF slice starting mid-line
receives a | presentation prefix when it fits. continuation_prefix identifies that prefix:
strip it before joining chunks to reconstruct the text. Offsets and total_chars count the
canonical text, excluding this presentation prefix.
Reading is limited to 10 MiB of file bytes, 200 PDF pages, 100,000 visited spreadsheet cells, one
million extracted characters and 50 MiB / 2,000 entries of expanded XLSX content. max_chars
has a ceiling of 50,000. Text is decoded in-process; all extracted text is cleaned of control
characters before paging. PDF/XLSX use a subprocess for crash and resource containment,
not a sandbox: server credential environment variables are absent,
but it runs as the same user with filesystem, network and Keychain access. A parent watchdog
polls RSS every 10 ms and kills a parser above 256 MiB on Linux, macOS and Windows; brief
overshoot between polls is possible. Only one parser runs at a time, with a 30-second wall timeout.
OS resource limits supplement these checks where supported.
A limit is an explicit error, never a silently partial document.
Folder Management
Tool | Description |
| Create mail folder (top-level, or nested under |
| Rename a mail folder, by ID. |
| Delete a mail folder by ID (refuses well-known folders). |
Threading and Batch
Tool | Description |
| Get all messages in a conversation thread. |
| Copy a message to another folder (name, path or ID). |
| Batch move/flag/categorize/mark_read (max 20 per call). Single Graph |
User and Admin
Tool | Description |
| Get current user profile. |
| List available calendars, including |
| List category definitions with colors. |
| 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 |
|
| Today's events, unread mail and tasks due, in the cheapest order — one scan each, |
|
| One cheap scan of a folder, sorted into reply / archive / junk, applied with a single |
|
| 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 |
|
|
| Azure AD application (client) ID. Required for auth. |
|
|
| Azure AD tenant. Use |
|
|
| Since 1.29: optional sign-in username for this instance. A saved sign-in for another username is refused before refreshing it; a new sign-in is checked before saving its record or using its credential. Case-insensitive; compares Microsoft's sign-in username literally, without resolving aliases. Unset keeps the existing behaviour. Older versions ignore this key with a warning and do not enforce the guard. |
|
|
| IANA timezone (e.g. |
|
|
| When |
|
|
| When |
|
|
| When |
|
|
| 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 |
|
|
| Optional. Restrict write tools to specific categories (see below). Empty list = all writes allowed when |
|
|
| 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. |
Environment configuration (optional)
auth, serve and status share the same loader. It first loads and validates config.json
(or the existing defaults when no file exists), then reads these optional variables. A bad,
unreadable or symlinked config still refuses startup; environment values cannot bypass it.
No override is automatically written back to the file.
Variable | Input | Relation to the file/default value |
| Nonempty string | Supplies |
| Nonempty string | Overrides |
| IANA timezone | Overrides |
|
| May enable a restriction; cannot disable one |
|
| May enable read-only consent; requires effective |
| JSON array of category names | May narrow the permitted categories; cannot widen them |
| Directory path | Must resolve to the configured directory or a descendant |
|
| May prohibit plaintext storage; cannot enable it unless the file already permits it |
Unset variables do nothing. A supported variable set to an empty value refuses startup,
including an empty Compose ${VAR} pass-through. Booleans accept only true/false
(case-insensitive, surrounding whitespace allowed); list input must be JSON, for example
["mail_drafts","contacts_write"].
An empty category list means all categories, so it cannot replace a restricted file list.
Each security setting is checked independently: enabling read-only mode does not excuse widening
another setting. Security permissions that require explicit consent in the file still require it.
Attachment roots are expanded and resolved without creating a directory. An override is kept as
the checked absolute path; .., sibling prefixes and symlinks cannot escape the configured root.
Every attachment path check rechecks that root, including when a directory becomes a symlink
after startup.
On Windows, a different drive/share or an unapproved UNC/device location is refused before
resolution can contact it.
Invalid inputs, misspelt security variables and attempts to loosen policy stop startup and name
the variable to fix in the launch environment. Existing OUTLOOK_MCP_CONFIG_DIR, toolset and
transport variables retain their meanings. With none of the new variables, file loading is unchanged.
These checks guard the supported setting variables, not the launch environment as a whole:
anyone who controls it can also retarget the settings file with OUTLOOK_MCP_CONFIG_DIR or HOME.
Toolset selection (optional) — OUTLOOK_MCP_TOOLSETS
The 71 default 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.
Groups: mail, drafts, attachments, calendar, contacts, todo, folders, digest, delta, admin, documents, and rules. Unset loads every group except the opt-in ones — documents and rules — so a stock install gets 71 of the 76 tools. Name rules here, or set mailbox_settings_write: true with OUTLOOK_MCP_TOOLSETS unset, to get the four rule tools; that setting is itself the request for rule management. A selection here always wins: the flag does not add rules to a narrower list. For example, OUTLOOK_MCP_TOOLSETS="mail,calendar,digest,delta" loads 31 tools instead of 71, cutting the per-turn schema cost to about 40% of the default.
Naming any group loads only the groups named, plus account, and a name that is not a group matches nothing. So to add both opt-in groups to the default set, name all thirteen: OUTLOOK_MCP_TOOLSETS=mail,drafts,attachments,calendar,contacts,todo,folders,digest,delta,admin,documents,rules.
The groups are not the headings of the Tool Reference. mail holds the mail read, write and triage tools, outlook_list_thread, outlook_copy_message and outlook_batch_triage, but outlook_list_folders is in folders; the Focused Inbox tools (outlook_reclassify_message and the three override tools) are in admin, with categories and mail tips; the three *_delta tools are in delta and outlook_changes_since in digest; outlook_list_calendars is in calendar; the two draft-attachment tools are in drafts, outlook_read_attachment in documents, and the four rule tools in rules; and account is outlook_auth_status and outlook_whoami.
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.
Since 1.29, to require a particular sign-in for an instance, add
"expected_username": "owner@example.com" to that instance's config.json. Older versions ignore
this key with a warning and do not enforce the guard. This optional guard compares Microsoft's
saved sign-in username case-insensitively; it does not resolve email aliases. A cached mismatch is
refused before a credential is built or refreshed, and outlook-mcp status shows the refusal and
remedy without either username: sign in as the expected user, or correct expected_username if it
is wrong. A new sign-in is checked after Microsoft's interactive sign-in completes but before its
record is saved or credential used. A refused sign-in leaves the previous auth record unchanged,
but azure-identity may already have added that account's refresh token to the local shared OS token
cache. On macOS this is the same Keychain item, with the previous account's tokens still present.
Nothing in outlook-mcp, including logout, removes these cached tokens.
Unset/null preserves today's behavior. Blank values and misspellings such as expected_usename
stop startup instead of silently disabling the guard.
Remote / HTTP transport (optional) — OUTLOOK_MCP_TRANSPORT
stdio is the default, and every client entry above uses it. For a server that runs on another machine or in a container, or a client that cannot spawn a local process, OUTLOOK_MCP_TRANSPORT=streamable-http serves MCP's streamable-HTTP transport at /mcp instead:
export OUTLOOK_MCP_TRANSPORT=streamable-http
export OUTLOOK_MCP_HTTP_HOST=127.0.0.1 # default 127.0.0.1
export OUTLOOK_MCP_HTTP_PORT=8000 # default 8000
export OUTLOOK_MCP_HTTP_TOKEN=... # python -c "import secrets; print(secrets.token_urlsafe(32))"
outlook-mcp serveThe client then connects to https://<your proxy>/mcp and sends Authorization: Bearer <token>.
OUTLOOK_MCP_TRANSPORT takes stdio (the default, also when unset or empty) or streamable-http. Any other value, a port outside 1–65535, a malformed OUTLOOK_MCP_HTTP_ALLOWED_HOSTS, or a missing or malformed token stops the server at startup with the reason, before anything binds.
For a container, explicitly set OUTLOOK_MCP_HTTP_HOST=0.0.0.0 and OUTLOOK_MCP_HTTP_ALLOWED_HOSTS=mcp.example.com for the public hostname your proxy forwards. Every public bind prints a plain-HTTP warning before it starts. A wildcard bind (0.0.0.0 or ::) without allowed hosts also warns that normal client Host headers will receive 421: the literal wildcard address is not the hostname or address clients use. The token protects against other OS users and browser pages; code running as your OS user can read the client configuration or launch the server itself. Forwarded headers are not trusted.
A secret file can replace the environment token: set OUTLOOK_MCP_HTTP_TOKEN_FILE to a regular file of at most 4096 bytes containing only the token (an ending newline is fine), and unset OUTLOOK_MCP_HTTP_TOKEN. Both set is refused. On POSIX the file must belong to the server user with no group or other permissions (chmod 600); symlinks are refused. On Windows, restrict the file ACL to the server account yourself; the server does not validate Windows ACLs. File contents and paths are never included in token-file errors.
Container secret mounts need the same file protections.
Kubernetes: projected Secret keys are symlinks, so their usual volume paths are refused. A file mounted with
subPathavoids that symlink, but must still belong to the server UID and have mode0400or0600;subPathalone does not fix ownership. For a non-root server, an init container can copy the projected key into a writableemptyDiras the server UID with mode0400, then the application mounts that prepared directory read-only. Recreate the Pod after rotation to refresh the copy orsubPathmount; subPath mounts do not receive Secret updates.Docker: Swarm secrets default to root-owned, world-readable files, which are refused. Set the secret's
uidto the server UID,gidto its group andmodeto0400. For Compose secrets backed by a local file,uid,gidandmodeare ignored: prepare a regular host file with the matching container UID and mode0400, and mount it read-only. SetOUTLOOK_MCP_HTTP_TOKEN_FILEto the resulting in-container file path. Restart the server after replacing a token; it reads the file only at startup.
This changes who can reach the mailbox. Over stdio, only the process that started the server can. Over HTTP, one request to the port is enough for anything that holds a token, so the token is the whole of the access control:
A token is required on every bind, loopback included. The server refuses to start without a token from
OUTLOOK_MCP_HTTP_TOKENorOUTLOOK_MCP_HTTP_TOKEN_FILE. On loopback, a port with no token would let other OS users or browser pages read the mailbox with one HTTP request. Every request must carryAuthorization: Bearer <token>or gets401. The token is one value of at least 32 characters fromA–Z a–z 0–9 -._~+/, at least 8 of them different (trailing=padding is allowed). This rejects obvious low-variety values, not every predictable token; use the generator above. To change it, restart the server with the new one.Plain HTTP sends the token in the clear. The server does not terminate TLS. On any bind other machines can reach, the token and everything the tools return cross the network readable by anything on the path, unless a reverse proxy in front of the server terminates TLS. Put it behind one, and let the proxy authenticate callers too if more than one client will reach it.
Host and Origin checks apply to every bind. Loopback binds accept loopback hosts and origins.
OUTLOOK_MCP_HTTP_ALLOWED_HOSTSoptionally adds comma-separated hostnames or IPs, with an optional port (for examplemcp.example.comormcp.example.com:8443). On a public bind it selects the permitted hosts; unset permits only the literal bind address. Bare names and:*entries permit any port, including a bare Host on the default HTTP/HTTPS port. Invalid Host is refused with 421; a supplied Origin must match an allowed host over HTTP or HTTPS, or gets 403. Clients without Origin work. A same-host proxy can sendHost: 127.0.0.1:<port>.File paths are on the server. Attach and send-with-attachments paths resolve inside the server’s
attachments_dir; a remote client cannot hand over its own local path. A downloaded file andsaved_tostay on the server, and a path refusal may name the server’s absolute attachments directory. Inlineattachmentsandas_content=Truecarry the bytes in the call instead (see Attachments).It is stateless. The server issues no
Mcp-Session-Idand answers each request with JSON rather than an event stream. No tool sends anything to the client mid-call, so nothing is lost.One process still serves one account. Pair it with
OUTLOOK_MCP_CONFIG_DIR, as for stdio (one process, one port and one settings directory per mailbox), and runoutlook-mcp authwhere the server runs, with the same environment. A container usually has no keyring; see Token cache stored unencrypted (Linux).No token, request URL or request line is logged.
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_onlyis a line in a text file. Anything able to edit~/.outlook-mcp/config.jsonturns 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:
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.Point
client_idat it and set both keys:{ "client_id": "<the read-only app>", "read_only": true, "read_only_consent": true }Run
outlook-mcp auth. Withread_only_consentthe 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 |
| create/update/delete draft, attach to/remove from a draft | Safe — drafts only, no send |
| move, delete (soft), flag, categorize, mark read, copy, batch, reclassify and set/delete Focused Inbox overrides | Moderate — reversible except hard delete |
| create/rename/delete folder | Moderate |
| create/update/delete inbox rule | Dangerous — rules run server-side, so one keeps moving, forwarding or deleting mail with every client closed |
| send, reply, forward, send_draft, send_with_attachments | Dangerous — sends email on your behalf |
| create/update/delete event, RSVP, attach/remove event files | Moderate — your own calendar, but |
| create/update/delete contact | Moderate |
| create/update/complete/delete task, checklist items; upload/delete task attachments | Moderate — your own task list, but |
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 eight 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.comandlogin.microsoftonline.com.Token storage. OAuth tokens are persisted via
azure-identity'sTokenCachePersistenceOptions. 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 byuv tool install), the server refuses to persist tokens unlessallow_unencrypted_token_cacheistrue; with it, they fall back to a0600plaintext file at~/.IdentityService/and the MCP logs a one-time warning at startup. For encrypted storage on Linux, installpython3-gi gnome-keyring libsecret-1-0and 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
0700and the config file0600, and a loose mode on the file is repaired on load. On Windows those POSIX modes cannot be enforced —os.chmodthere 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.
HTTP transport (opt-in). It changes who can reach the mailbox: a bearer token is required on every bind and checked on every request, and the server speaks plain HTTP, so TLS belongs to a proxy in front. The whole security story is in Remote / HTTP transport.
Development
# Install dev dependencies and the documents extra, as CI does (without it the PDF/XLSX tests skip)
uv sync --all-extras
# 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-mcpRequirements: Python 3.10+
Roadmap
Advanced mail -- raw MIME export, internet message headers
Calendar -- cancel event (with attendee notification)
Work/school-only tools -- free/busy, meeting times, automatic replies, shared mailboxes: not planned for now (#133). If any are taken later, they come as an opt-in group that personal accounts never load
Committed direction, and what was investigated and ruled out (mailbox settings), is in ROADMAP.md.
License
MIT. See LICENSE.
Available Tools
71 toolsoutlook_add_checklist_itemC
Add a checklist item (sub-step) to a To Do task.
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | No | ||
| task_id | Yes | ||
| display_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false, so mutation is already known; the description adds nothing about whether the item is appended to the end, whether duplicates are prevented, or what errors occur for an invalid task_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; concise, though the brevity is partly under-specification rather than economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A write tool with no output schema and undocumented parameters should at least say whether the created item's identifier is returned (needed for the follow-up update/delete checklist item calls) and how list_id relates to task_id; neither is covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across three parameters, and the description mentions none of them — notably list_id, whose purpose and relationship to task_id is entirely unexplained by either the description or the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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)') scoped to a To Do task, which cleanly separates it from sibling update_checklist_item and delete_checklist_item by operation type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus outlook_update_task or outlook_update_checklist_item, and no prerequisite stated (e.g. that the target task must already exist in a task list).
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. attachments: inline files [{name, content_base64, content_type?}], up to
3MB each. Returns new attachment IDs for later removal via
outlook_remove_draft_attachment.
| Name | Required | Description | Default |
|---|---|---|---|
| draft_id | Yes | ||
| attachments | No | ||
| attachment_paths | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the permissive annotations (readOnlyHint=false, destructiveHint=false), it discloses the 3MB auto-switch threshold, the attachments_dir resolution rule, that out-of-directory paths are refused, the 3MB per-inline-file cap, and the return value (new attachment IDs). That is exactly the operational context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the 3MB rule are front-loaded in the first sentence, and every subsequent clause carries real information. Minor deduction for the mid-sentence line wrapping that slightly fragments the `attachments` clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no schema descriptions, the description still covers all three parameters' meaning and the return value, which is sufficient to invoke it correctly. Residual gaps: whether attachments append to or replace existing ones, and any total-size limit across multiple files.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the inline `attachments` schema is only an untyped additionalProperties object. The description compensates by spelling out the item shape ({name, content_base64, content_type?}), the per-item size limit, and the path-resolution/security semantics of `attachment_paths` — far more than the schema alone conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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") plus a notable behavioral trait (auto-switching to upload-session above 3MB). This clearly separates it from outlook_create_draft, outlook_send_with_attachments, and outlook_attach_to_event 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The target resource (an existing draft) makes the applicable context clear, and the return-value sentence points to outlook_remove_draft_attachment as the paired follow-up tool. It stops short of stating when-not to use it (e.g., attaching to a task or message, or creating a draft with attachments in one step).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_attach_to_eventADestructive
Attach files to an event; auto-switches to upload-session for files >3MB.
attachment_paths resolve inside attachments_dir, as for outlook_attach_to_draft.
Attendees get the files with the event's next update. Returns new attachment IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | ||
| attachment_paths | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=true. The description adds real behavior the annotations cannot convey: transparent upload-session switching above 3MB, path resolution scoped to `attachments_dir`, deferred delivery to attendees, and the return of new attachment IDs. It stops short of saying whether existing attachments are replaced or whether anything is destroyed, which is notable given destructiveHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler; the core action and the size-threshold behavior are front-loaded. The cross-reference to another tool for path semantics is economical but pushes detail out of the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with no output schema, the description covers the size-dependent upload path, path scoping, delivery timing, and the return value. The remaining gap is the destructiveness/mutation semantics implied by the annotations, which an agent would want spelled out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 for both parameters. It partially does so: `attachment_paths` is explained as resolving inside `attachments_dir` (with a cross-reference to a sibling tool for the exact rules), but `event_id` is never addressed. Half-compensation for a low-coverage schema puts it at a middling score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first clause states a specific verb and resource ('Attach files to an event') and immediately notes the >3MB upload-session switch. It is clearly distinguishable from the mail-attachment and draft siblings, though it does not explicitly say when to prefer this over outlook_attach_to_draft.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The mention of 'as for outlook_attach_to_draft' and the note that attendees receive the files on the event's next update implies the event context but gives no explicit when-to-use or when-not guidance. The agent must infer that this is the calendar counterpart to the draft attachment tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_auth_statusARead-only
Check authentication status. Run outlook-mcp auth on the host if needed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description usefully adds a remediation path for the failure case, but says nothing about what the status reflects (token expiry, account, scopes) or what happens when unauthenticated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the purpose and followed by the actionable fallback. No wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description ideally would say what a status result contains (e.g., authenticated true/false, account, expiry). For a simple diagnostic tool the gap is minor but real, and the sibling overlap with outlook_whoami remains unresolved.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check authentication status'), which is clear on its own. However, it does not differentiate itself from the sibling outlook_whoami, which plausibly also reports identity/auth information, leaving the agent to guess which to call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The remediation hint ('Run `outlook-mcp auth` on the host if needed') implies this is a pre-flight/diagnostic check, but the description never states when to call this versus outlook_whoami or other tools, nor any exclusion conditions.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | ||
| action | Yes | ||
| message_ids | Yes |
TDQS
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 the meaningful batch constraint (single $batch call, 20-message cap), but says nothing about partial-failure behavior, ordering, or error handling for a multi-item mutation, which is the main behavioral question here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core capability, then action values, then a concrete example, then value semantics and the hard cap. No filler sentences; each line adds information the schema lacks.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-required-param batch mutation with no output schema and no enum enforcement, the description covers inputs well but omits any indication of what comes back (per-message results? aggregate success?) and how over-cap or invalid action inputs are handled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load, and it does: it names the valid action values (move/flag/categorize/mark_read) and explains that `value` is the action target with per-action meaning, plus an inline example showing message_ids usage. Weakness: "status for flag/mark_read" is vague and no action enum exists in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (triage) and resource (up to 20 messages in one $batch call) and enumerates the four supported actions. It is distinguishable from per-message siblings like outlook_move_message or outlook_flag_message by the batching scope, though it never explicitly says so.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The batch framing and the "hard cap of 20" imply when to reach for this over single-message tools, but no explicit rule is given (e.g., use this instead of outlook_move_message when handling multiple messages). No prerequisites or exclusion conditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_categorize_messageBIdempotent
Set categories on a message (replaces the full list).
Example: outlook_categorize_message(message_id=..., categories=["Follow-up", "Pricing"])
| Name | Required | Description | Default |
|---|---|---|---|
| categories | Yes | ||
| message_id | Yes |
TDQS
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 description is not the only source of safety information. It does add real value by disclosing the overwrite semantics ("replaces the full list"), which is the single most important behavioral fact here. However it says nothing about whether unknown category names are auto-created, rejected, or silently ignored, which materially affects how the agent should construct the argument.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two lines total, with the overwrite constraint front-loaded before the illustrative call. Nothing is padded, and the example is compact enough to earn its place as a parameter-shape demonstration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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, the definition covers the core behavior but leaves out the return value and the validation/creation rules for category names. An agent can call it, but may produce wrong results if it passes new category names or omits existing ones, so it is adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. The inline example does clarify the shape of both parameters (a message_id string and a categories string array), which is better than nothing. It still leaves open the accepted format of message_id and the rules for category strings, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Set categories on a message") and adds the crucial qualifier that the operation replaces the full list. It is clearly distinct from read/flag/move siblings, though it does not explicitly differentiate itself from outlook_reclassify_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: because the operation replaces the full list, the agent can infer it must gather existing categories first, but this is never stated as a prerequisite. No mention of when to use this instead of outlook_reclassify_message, nor of outlook_list_categories as the way to find valid category names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_changes_sinceARead-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=<delta_tokens from prior response>).
First call covers the last fallback_window_hours (default 24); later calls (tokens
passed back) return only what changed. Replace stored delta_tokens with the returned dict;
never merge them. has_more true: a resource stopped early; pass the returned dict back.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| delta_tokens | No | ||
| fallback_window_hours | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Regardless of the readOnlyHint annotation, it discloses behavior an agent could not infer: stateful token lifecycle, token independence per resource, auto-resync on Graph 410/syncStateNotFound, and that has_more means one resource stopped early. It also defines the derived fields (urgent_flagged = high-importance OR flagged; by_sender = top 5) and flags known empty fields (calendar organizer_email, modified[]).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and routing before the operational detail, and nearly every sentence carries unique operational value. It is dense and runs long, with the calendar caveats tacked onto the end where they are easy to lose, but nothing is truly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must describe return values and it does: counts, urgent_flagged, by-sender rollup, new/cancelled events, contacts counts, the returned delta_tokens dict, has_more, and _meta.resync. Combined with the token lifecycle and known-gap disclosures, an agent has everything needed to call it correctly across a multi-turn loop.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and delta_tokens is an untyped nested object, yet the description fully specifies its semantics: omit on first call, pass back the value from the prior response, replace rather than merge stored tokens, drop individual stale tokens without re-syncing others. It also explains fallback_window_hours (default 24, window size on the first call), which the schema leaves undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and scope: one structured 'since last call' digest across mail, events, and contacts. It immediately lists the concrete payload (counts, urgent_flagged, by-sender rollup, new/cancelled events, contacts counts), so an agent can distinguish it from the per-resource delta siblings without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the trigger use case explicitly (recurring agent loops: morning brief, hourly inbox sweep) and names the alternatives with the condition that selects them: the three delta tools when raw item lists or per-resource control are needed. That is when/when-not plus named alternatives, the full 5 bar.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | No | ||
| task_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation/non-destructive profile is covered structurally. The description adds nothing beyond that: it does not say whether completion is reversible, what happens if the task is already completed, or how the task is located (by id alone or within list_id).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with the action front-loaded and no filler. It is appropriately sized for the operation, though its brevity is partly under-specification rather than true economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with 0% schema description coverage and no output schema, the description is too thin — the meaning and necessity of list_id, and the result of the call, are left entirely unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 fails: it never explains task_id's format or whether list_id is required to disambiguate the task lookup. At best 'a To Do task' weakly implies task_id identifies the target, which is a marginal addition over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Mark a To Do task as completed'), which is unambiguous about the effect. It does not distinguish itself from the sibling outlook_update_task, which could plausibly also set completion status, so an agent has no basis for choosing between them from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of prerequisites (does the task need to exist in a specific list?), and no reference to alternatives such as outlook_update_task. The agent must infer everything about selection from the tool name.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | Yes | ||
| message_id | Yes |
TDQS
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 known. The description adds real value by spelling out the duplicate-and-leave-source semantics, but it says nothing about whether attachments, categories, or flags carry over to the copy, which is the main behavioral ambiguity for a copy operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core semantics front-loaded in parentheses and the sibling pointer after. No filler, and the folder-format note is compact enough to justify its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-param, non-destructive tool with no output schema, this covers the decision and the invocation. The remaining gap is what the resulting copy retains versus the original, which an agent might reasonably want before copying a message with attachments.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load, and it does for the non-obvious parameter: `folder` accepts display names, well-known names, or Graph IDs, with a stated preference. `message_id` is left implicit, which is defensible since its meaning is self-evident, but the format is never confirmed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Copy a message to another folder") and immediately clarifies the key semantic distinction: duplicates, source unchanged. This separates it cleanly from outlook_move_message, which appears among its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use outlook_move_message to remove from source, use this to duplicate. It names the alternative and the condition that selects each, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_create_contactA
Create a new contact with name and optional email, phone, company, job_title, birthday (YYYY-MM-DD).
title is the name prefix ("Dr.", "Ms."), shown in the display name — not the job. phone_type: "mobile", "business" or "home".
| Name | Required | Description | Default |
|---|---|---|---|
| No | |||
| phone | No | ||
| title | No | ||
| company | No | ||
| birthday | No | ||
| job_title | No | ||
| last_name | No | ||
| categories | No | ||
| first_name | Yes | ||
| phone_type | No | mobile | |
| middle_name | No | ||
| personal_notes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the write/safety profile is covered. The description adds genuine disambiguation value ("title ... is not the job"), but says nothing about duplicate handling, required permissions, or what happens on partial input.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the operation before the field clarifications. The parenthetical and the title/phone_type notes each earn their place, though slightly telegraphic phrasing pushes it just shy of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 12 zero-documented parameters and no output schema, a complete definition would have to explain the undocumented fields or at least the creation result. Given the moderate complexity, the current coverage is adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 12 parameters, so the description must compensate. It clarifies birthday format (YYYY-MM-DD), the title-vs-job_title trap and phone_type values, but leaves categories, middle_name, last_name, personal_notes and default phone_type semantics (only the default value is given) undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ("Create a new contact"), then enumerates the addressable fields, so an agent can tell it apart from outlook_update_contact or outlook_delete_contact 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The create semantics are self-evident, but the description never says when to reach for this versus outlook_update_contact (e.g. contact already exists) or whether duplicates are checked. 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_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. reply_to_message_id (reply_all=True for all) or forward_message_id drafts in that thread, quoting the original; on a reply, Graph fills to/cc/subject, so pass [] for a recipient you want cleared and omit the argument to keep Graph's choice. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | ||
| to | No | ||
| bcc | No | ||
| body | Yes | ||
| is_html | No | ||
| subject | No | ||
| reply_to | No | ||
| reply_all | No | ||
| importance | No | normal | |
| is_markdown | No | ||
| forward_message_id | No | ||
| reply_to_message_id | No | ||
| deferred_send_datetime | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false and destructive=false. The description adds meaningful behavior beyond that: drafts are for later review/send, deferred_send_datetime schedules server-side holding after outlook_send_draft, and Graph's reply auto-fill can be overridden by passing [] versus omitting a recipient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded: it leads with purpose and alternative, then uses compact parentheticals for scheduling and reply/forward semantics. For a 13-parameter tool with no schema descriptions, the length is justified and no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 13 parameters, no output schema, and minimal annotations, the description covers the non-obvious threading, forwarding, and scheduling behavior well. It is less complete on basic formatting flags and some recipient fields, but an agent can still call it correctly for common draft creation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage across 13 parameters, the description compensates for several non-obvious ones: reply_to_message_id, reply_all, forward_message_id, deferred_send_datetime, and reply_to. It also explains the subtle [] versus omitted behavior for reply recipients. However, it leaves bcc, is_html, is_markdown, importance, and body format semantics undocumented, so coverage remains partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a draft email') and explicitly distinguishes the draft workflow from immediate sending by naming outlook_send_message and outlook_send_draft. An agent can identify the tool's role without inspecting siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: choose this when a human should review before sending, and use outlook_send_message for immediate send without review. It also says to pair with outlook_send_draft, covering the follow-up action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_create_eventADestructive
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.
calendar: name or ID; omit for the default.
key: your own reference for the event, e.g. a booking number.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| key | No | ||
| body | No | ||
| start | Yes | ||
| show_as | No | ||
| subject | Yes | ||
| calendar | No | ||
| location | No | ||
| timezone | No | ||
| attendees | No | ||
| is_online | No | ||
| is_all_day | No | ||
| recurrence | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it warns that `is_online` is silently ignored on consumer mailboxes (with the exact failure shape Graph returns), that Teams meetings need a work/school account, that `recurrence` produces a series rather than a single event, and that omitting `show_as` defaults to busy. These are non-obvious backend behaviors an agent could not get from `destructiveHint: true` alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a one-line summary plus a concrete call example, then ordered by parameter importance. It is long, but the length is earned by 13 undocumented parameters and several genuinely surprising behaviors; a few sentences (the full Graph JSON example, the repeated noEnd warning) could be tightened without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 would ideally say what comes back (an event ID? retrievable via outlook_find_event_by_key using `key`?) — that link is left implicit. Otherwise it covers the mutation semantics, account-type constraints, and defaulting behavior needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage across 13 parameters, the description does the heavy lifting: it defines the accepted values of `show_as` (a de-facto enum), the IANA format for `timezone` with an explicit anti-pattern (never "PDT"), the ISO 8601 format for start/end, the dual string-or-object shape of `recurrence`, and the meaning of `key`. `body`, `location`, and `is_all_day` are left undefined, which is why it falls short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Create a calendar event") and enumerates the salient optional dimensions (attendees, recurrence, busy status, online meeting). An agent can distinguish it from outlook_update_event/outlook_delete_event by verb alone, but the description never names those siblings or states the boundary explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Rich conditional guidance: use the shorthand recurrence strings for the common cases and the full Graph object "for anything else," prefer a bounded range when attendees exist, omit `calendar` for the default. What's missing is routing against siblings (e.g. use outlook_update_event to modify an existing event) — the agent must infer the create-vs-update boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_create_folderB
Create a mail folder; pass parent_folder (name, path or ID) to nest it under that one.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| parent_folder | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-destructive write, and the description adds only the nesting behavior. It omits what happens when the folder already exists, whether the parent is auto-resolved or must pre-exist, and any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the action front-loaded and the parameter hint second; no filler or restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a two-parameter creation tool, but with no output schema the agent is left without the created folder's identifier, which is typically needed for follow-up moves or listing, and error behavior on duplicate names is unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the burden. It usefully discloses that parent_folder accepts a name, path, or ID, resolving real ambiguity; however the required `name` parameter gets no mention and no format/constraint detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a mail folder'), which cleanly separates it from the other folder siblings (rename_folder, delete_folder, list_folders). It does not explicitly name those siblings, but the verb makes selection unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence explains a parameter's effect ('pass parent_folder to nest it') rather than when to use this tool versus alternatives. There is no guidance on prerequisites, what happens on a duplicate name, or when a flat folder is preferable to a nested one.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| due | No | ||
| body | No | ||
| title | Yes | ||
| list_id | No | ||
| reminder | No | ||
| importance | No | ||
| recurrence | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the readOnlyHint=false / destructiveHint=false annotations by disclosing a silent-failure mode ('Graph silently drops a reminder that has no time') and a defaulting side effect (falls back to the default list). It also flags the ambiguous relative-offset parsing where a bare '7d' means seven days ago, which is exactly the kind of trap an agent would otherwise hit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by a compact example and four short, high-value notes; each line carries distinct information. The example line is mildly redundant with the notes but earns its place by showing argument names in use.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter create tool with a nested object and no output schema, the description covers the risky and ambiguous parameters well. The gap is recurrence, an untyped nested object with no explanation anywhere in the definition, and no hint of what the call returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage the description must carry the load, and it does for due (ISO 8601 or relative offset), importance (low/normal/high), reminder (requires due), and list_id (default-list fallback). It documents neither the shape of the nested recurrence object nor anything about body beyond 'optional body', leaving two of seven parameters thin.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a Microsoft To Do task') and enumerates the optional fields, which cleanly separates it from the sibling mutators outlook_update_task, outlook_complete_task, and outlook_delete_task. An agent can identify the right 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear operating context: list_id omission falls back to the user's default list, and reminder=True requires due. It does not explicitly state when to prefer outlook_update_task or outlook_add_checklist_item instead, so the routing guidance is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_delete_checklist_itemBDestructive
Delete a checklist item from a To Do task.
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | No | ||
| task_id | Yes | ||
| checklist_item_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=false and destructiveHint=true, so the agent knows this is a destructive write. The description adds the parent context that the item belongs to a To Do task, but it does not explain irreversibility, permission needs, or side effects. With annotations carrying the safety profile, this is minimally adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no redundant or filler text. Every word contributes to identifying the action and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a destructive three-parameter tool with 0% schema description coverage and no output schema. The description identifies the operation and parent resource but omits parameter guidance, usage context, and behavioral consequences. It is not complete enough for reliable invocation without inspecting the schema manually.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the schema provides no semantics for task_id, checklist_item_id, or list_id. The description implicitly references task and checklist item, which maps to the two required IDs, but it says nothing about list_id, ID formats, or where those IDs come from. It does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: delete a checklist item from a To Do task. This distinguishes it from deleting an entire task or task attachment. It does not explicitly differentiate from sibling checklist operations, but the resource noun is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, prerequisites, or alternatives. It does not tell the agent when to delete a checklist item versus updating the task or using a related sibling. Usage is only implied by the operation itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_delete_contactCDestructive
Delete a contact by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| contact_id | Yes |
TDQS
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 covered structurally. The description adds nothing beyond that: it does not say whether the deletion is permanent or recoverable, what happens if the contact_id does not exist, or whether permissions beyond standard auth are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is front-loaded and wastes no words, but it reads as under-specification rather than disciplined brevity for a destructive mutation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an irreversible-looking destructive operation with no output schema and an entirely undocumented parameter, the description omits the essentials: permanence, error behavior on missing IDs, and where a valid contact_id comes from. An agent could call it, but not confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. 'By ID' is the only clue, and it only confirms that contact_id is an identifier rather than a name or email — a marginal addition over the property name itself. No format, source, or validity constraints are given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Delete') and resource ('a contact'), which distinguishes it from the many other delete tools among the siblings (delete_message, delete_task, delete_event, delete_folder). It stops short of any framing beyond that, but an agent can identify the operation unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 versus alternatives such as outlook_update_contact, nor any precondition (e.g., confirm the contact first, verify the ID came from outlook_search_contacts). The agent is left to infer all 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_draftCDestructive
Delete a draft message by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| draft_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and readOnlyHint=false, so the irreversible nature is structurally conveyed. The description adds nothing on top of that: it says nothing about permanence, whether the draft can be recovered, or whether attachments are discarded with it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action, with no filler. It is terse to the point of under-specification, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with annotations and no output schema, this is minimally viable: the agent knows what is deleted. It is missing the source of the ID and any statement of consequence, which matter more here because the operation is irreversible.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the single draft_id parameter carries no documentation of its own; the phrase "by ID" at least confirms that draft_id is the draft's identifier and is required. It stops short of saying what form the ID takes or where to obtain it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Delete a draft message") and adds the identifier constraint ("by ID"), so an agent knows exactly what the call performs. It does not explicitly contrast with the neighboring outlook_delete_message, which is the closest confusable sibling for an agent holding a draft ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when this should be used rather than outlook_delete_message, nor any prerequisite such as where a valid draft_id comes from (e.g., outlook_list_drafts). The usage is only inferable 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_delete_eventADestructive
Delete a calendar event by ID (cancels and notifies attendees if you're the organizer).
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the destructiveHint=true annotation by disclosing the downstream side effect: cancellation plus attendee notifications when the caller is the organizer. It does not state whether the deletion is irreversible, whether it requires organizer/owner permissions, or what happens for non-organizers, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no waste; the parenthetical adds the non-obvious side effect rather than restating the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with annotations already flagging destructiveness and no output schema, the description covers the essentials plus the attendee-notification consequence. Only irreversibility and required permissions are left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One parameter with 0% schema description coverage, so the description must carry the burden. 'By ID' identifies the parameter's role but adds nothing about format, origin, or whether it's the Graph event ID versus an iCalUID.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) plus resource (calendar event) and the keying mechanism (by ID). Easily distinguished from siblings like outlook_update_event or outlook_list_events without consulting their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the delete verb and the ID argument, but no explicit guidance on when to use this versus outlook_update_event (to modify) or how to obtain a valid event_id (e.g., from outlook_list_events / outlook_find_event_by_key). No exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_delete_folderADestructive
Delete a user-created mail folder by ID; refuses well-known folders (inbox, sentitems).
| Name | Required | Description | Default |
|---|---|---|---|
| folder_id | Yes |
TDQS
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 adds one genuine behavioral rule beyond that (name-based rejection of well-known folders), but it is silent on the important destructive question: whether deleting a folder cascades to its messages and child folders, and what error/permission conditions look like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the primary action front-loaded and the constraint trailing for emphasis. Nothing is redundant or padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, single-parameter tool with no output schema, the definition covers the core action and one guardrail but leaves gaps an agent would want: how to discover a valid folder_id and whether folder contents are destroyed along with the folder.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description has to carry the load for folder_id. 'By ID' confirms it takes an identifier, but does not say where that ID comes from (outlook_list_folders) or whether it accepts display names or well-known names — the only hint is that well-known names are rejected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (delete a mail folder) plus the scope restriction that it must be user-created, which is what separates it from folder-creation/rename siblings and from message-level deletes like outlook_delete_message. An agent can tell exactly what class of object this operates on 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'refuses well-known folders (inbox, sentitems)' clause gives an explicit when-not condition, which is real routing guidance. It stops short of naming an alternative path (e.g. use outlook_delete_inbox_override or outlook_move_message for well-known folder contents) or saying how to obtain a valid folder_id via outlook_list_folders.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_delete_inbox_overrideBDestructive
Delete a Focused Inbox per-sender override rule by its ID.
| Name | Required | Description | Default |
|---|---|---|---|
| override_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description's 'Delete' is consistent with that. However, it adds nothing beyond the annotations — no mention of irreversibility, whether the rule can be recreated, or what happens to messages previously routed by the rule.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource and the identifying parameter are both stated immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter delete with annotations covering the safety profile and no output schema, this is nearly sufficient. The only missing piece is how to discover a valid override_id, which would help an agent call it correctly without a failed attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single override_id parameter, so the description must carry the burden. It does say the rule is deleted 'by its ID', which clarifies the identifier role, but does not indicate the ID format or where to source it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and a precisely-scoped resource (Focused Inbox per-sender override rule) plus the identifier used. It is clearly distinct from outlook_list_inbox_overrides and outlook_set_inbox_override, though it does not name them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus set_inbox_override or how to obtain a valid override_id (e.g., via outlook_list_inbox_overrides). The usage is only implied by the name and verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_delete_messageADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| permanent | No | ||
| message_id | Yes |
TDQS
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 carried structurally. The description does add real value by disclosing the recoverable-default / permanent-flag split, but says nothing about behavior on a missing message_id or whether permissions or mailbox scope affect deletion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the effect and its reversible default, followed by the anti-pattern warning. Nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive tool with annotations covering safety, this is nearly complete: the soft/hard distinction and the sibling exclusion are the essentials. Only gaps are message_id provenance and error behavior, which are modest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load. It fully explains `permanent` (default soft delete, True = hard delete) but leaves `message_id` entirely undocumented — its source (list/read/search siblings) and format are left to inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Delete a message") and immediately names the sibling it must not be confused with: outlook_move_message(folder="deleteditems"). An agent can pick it apart from the move tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Declares itself the canonical deletion path and gives an explicit when-not with the exact alternative call to avoid. This is direct routing guidance rather than implied context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_delete_taskCDestructive
Delete a task from a Microsoft To Do list.
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | No | ||
| task_id | Yes |
TDQS
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 the annotations: it does not say whether the delete is permanent or recoverable, what happens to attached files/checklist items, or whether a nonexistent task errors out.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler, front-loading the action and target. It is efficient but arguably under-specified rather than genuinely well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema and zero parameter documentation, the description is too thin. It should at minimum clarify permanence, the role of list_id, and any auth or scope requirements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 does not. It never explains that task_id is required and list_id is optional, nor what happens when list_id is omitted — a real ambiguity given the same task name may exist in multiple lists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (task in a Microsoft To Do list), distinguishing it from nearby siblings like outlook_delete_checklist_item and outlook_delete_task_attachment by scoping to the task itself. It does not explicitly name the sibling alternatives, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 versus alternatives such as outlook_complete_task (closing out a task) or outlook_delete_checklist_item, and no stated prerequisites or exclusions. The agent must infer that deletion is for removal rather than completion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_delete_task_attachmentCDestructive
Remove an attachment from a To Do task.
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | No | ||
| task_id | Yes | ||
| attachment_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the description's only real claim ('Remove') merely restates them. It adds no context on irreversibility, whether the attachment can be recovered, or any permission/ownership requirement for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with the action and target front-loaded and no filler. It is efficient, though the brevity is achieved by omission rather than by disciplined editing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with three undocumented parameters and no output schema, the description supplies almost nothing an agent needs to call it safely or correctly. The list_id ambiguity alone makes it insufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description bears full responsibility, yet it names no parameters at all. In particular the optional 'list_id' is left completely unexplained, so an agent cannot tell when it must be supplied versus omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Remove') and resource ('an attachment from a To Do task'), which clearly separates it from siblings like outlook_upload_task_attachment, outlook_download_task_attachment and outlook_remove_draft_attachment. It does not explicitly name a sibling to contrast with, so it lands just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance and no mention of prerequisites such as needing the parent task or list context. The agent must infer entirely from the verb that this is the deletion counterpart to upload/list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_download_attachmentAIdempotent
Download an attachment to save_path on the host, or return it with as_content=True.
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. as_content writes nothing; 10 MB at most.
| Name | Required | Description | Default |
|---|---|---|---|
| save_path | No | ||
| as_content | No | ||
| message_id | Yes | ||
| attachment_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing path confinement behavior, refusal of paths outside the attachments directory, that reads and writes share the same directory, that as_content writes nothing, and the 10 MB size limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded, compact, and structured around the two main invocation modes. Every sentence adds useful operational detail without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and zero schema parameter descriptions, the description covers the main file-path and content-return behavior but omits the meaning of the required message_id and attachment_id parameters and does not clarify the return shape when as_content is used.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaningfully explains save_path and as_content semantics, but it does not explain the required message_id or attachment_id parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb and resource: download an attachment, either to save_path or returned as content. It is easy to understand, but it does not explicitly distinguish this from the sibling outlook_download_task_attachment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the two operating modes (save to disk vs. return content) and when as_content avoids writing, but gives no explicit guidance on when to use this tool instead of related siblings such as outlook_list_attachments or outlook_download_task_attachment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_download_task_attachmentAIdempotent
Download a To Do task attachment to a local file, or return it with as_content=True.
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. as_content writes nothing; 10 MB at most.
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | No | ||
| task_id | Yes | ||
| save_path | No | ||
| as_content | No | ||
| attachment_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses important behavior: `save_path` is constrained to the configured attachments directory, writes are atomic via temp-file-plus-replace, failed downloads do not truncate existing files, `as_content` writes nothing, and downloads are capped at 10 MB. These details materially improve safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, stating the primary action first and then the important write-safety and size constraints. Every sentence adds useful information; nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a download tool with annotations and no output schema, it covers the main invocation modes, path behavior, atomicity, and size limit. The remaining gap is that it does not specify the exact form of the returned content when `as_content=True`, nor does it explain `list_id`.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds strong semantics for `save_path` and `as_content`, but does not explain `list_id`, `task_id`, or `attachment_id`, leaving three of five parameters undocumented beyond their names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: download a To Do task attachment, with two retrieval modes. It distinguishes itself from generic attachment or task-listing siblings by naming the exact attachment type and the local-file versus content behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains the two modes: default save-to-file and `as_content=True` for returning content. However, it does not explicitly say when to use this tool versus related siblings such as `outlook_list_task_attachments` or `outlook_download_attachment`, leaving selection context mostly inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_find_event_by_keyARead-only
Find events by the key given to outlook_create_event or outlook_update_event.
Any date. Searches the default calendar, or calendar. Returns events and series
masters, not occurrences.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| calendar | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the bar is lower. The description adds valuable behavior: searches the default calendar or a specified one, covers any date, and returns events and series masters (not occurrences). This clarifies return semantics beyond annotations. Lacks details like handling multiple matches or pagination, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core purpose. Every sentence adds useful information: key origin, date scope, calendar behavior, and return type. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 2 parameters, one required, no output schema, and read-only annotations, the description covers what the tool does, when to use it, what it searches, and what it returns. It omits error handling or behavior when multiple events share a key, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 that `key` comes from create/update and that `calendar` defaults to the default calendar. This adds meaningful semantics beyond the bare string types, though it doesn't specify key format or calendar syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Find events by the `key`') and adds scope details ('Any date', 'Returns events and series masters, not occurrences'). It does not explicitly differentiate from siblings like outlook_get_event, but the key-based lookup is clear enough to distinguish it from list/get tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: use when you have a key from outlook_create_event or outlook_update_event. Implies no date filtering ('Any date') and mentions calendar scope. Does not state when to prefer other tools or any exclusions, keeping it at a 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_flag_messageBIdempotent
Set the follow-up flag on a message. status is "flagged", "complete", or "notFlagged".
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ||
| message_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=true, so the safety profile is covered. The description adds the three legal flag states, which is genuinely useful, but says nothing about permissions, whether existing flags are overwritten, or what happens on an invalid message_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with no filler. The action comes first and the parameter vocabulary second, which is the right order for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 could reasonably say what the call returns. For a mutation tool with only annotation-level coverage, the definition is minimally adequate but leaves message_id handling and permission requirements unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the status parameter has no enum in the schema, so the description's enumeration of 'flagged', 'complete', 'notFlagged' is a real addition beyond the structured data. However, message_id (required) receives no explanation of format or where to obtain it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Set the follow-up flag on a message'), which is clearly distinct from sibling operations such as outlook_mark_read or outlook_categorize_message. It does not explicitly contrast itself with siblings, but the operation is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 adjacent tools (mark_read, categorize_message, complete_task) and no prerequisites or constraints stated. The agent must infer the use case entirely from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_forwardCDestructive
Forward an existing message to new recipients, with optional comment.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| comment | No | ||
| message_id | Yes | ||
| is_markdown | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already supply the safety profile (readOnlyHint=false, destructiveHint=true), and the description adds nothing beyond them. It is silent on key behaviors for a forward: whether it sends immediately, whether attachments and original body are carried over, whether a copy lands in Sent Items, and what permissions/scope are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or redundancy. However, the brevity comes at the cost of substance, so it reads as under-specified rather than optimally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 4 undocumented parameters, zero schema coverage, no output schema, and a mutation annotation, the description does far too little. An agent still cannot know how to format recipients, what is_markdown controls, or what the forwarding side effects are.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 must compensate and largely does not. It only loosely maps 'new recipients' to `to` and 'optional comment' to `comment`; `message_id` and especially `is_markdown` (a format flag affecting the comment rendering) are entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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') plus the target ('new recipients'), so an agent can tell it apart from outlook_reply and outlook_send_message. It lacks any explicit sibling differentiation, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no statement of prerequisites (where message_id comes from, e.g. outlook_list_inbox/outlook_read_message), and no comparison to the neighboring outlook_reply, which is the closest alternative. 'Forward an existing message' implies the tool's purpose but gives no decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_get_contactBRead-only
Get one full contact by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| contact_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals a safe read, so the description's remaining job is small. "full contact" adds genuine value by indicating a complete record is returned rather than a summary projection, but nothing is said about behavior on an invalid or missing ID.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single seven-word sentence with zero filler and the key qualifier ("full", "by ID") front-loaded. It is efficiently sized, though the terseness borders on under-specification rather than optimal concision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read with readOnlyHint set and no output schema, the essentials are present. Still missing are the ID format and error behavior on a bad ID, which an agent would need to invoke this reliably.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter has 0% schema description coverage, so the description must carry the burden and largely does not. It indicates contact_id is an identifier but gives no format (entry ID vs. email address) or example, leaving the agent to guess what constitutes a valid value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Get") and resource ("contact") with a scope qualifier ("one full contact by ID"), which cleanly separates it from siblings like outlook_list_contacts and outlook_search_contacts. It stops short of naming those siblings explicitly, so it's clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"by ID" implicitly tells the agent this is a direct-lookup tool requiring a known identifier, which contrasts with list/search siblings. However, there is no explicit statement of when to use this versus outlook_search_contacts or outlook_list_contacts, nor how to obtain the ID.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_get_eventARead-only
Read an event by event_id, or an invitation by message_id (exactly one).
Returns your current event: body, attendees with proposed_new_time, organizer, is_organizer, allow_new_time_proposals, is_cancelled, recurrence, type, show_as, key and attachment metadata. start/end are UTC; original_start_time_zone is the anchor zone. recurrence uses the create tool's shape.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | No | ||
| message_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already declares the read-only profile, but the description adds substantive context beyond annotations: the returned fields (attendees with proposed_new_time, is_organizer, allow_new_time_proposals, recurrence), the UTC convention for start/end with original_start_time_zone as anchor, and that recurrence matches the create tool's shape. It stops short of stating whether cancellation still returns the record or how attachments are represented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the invocation rule in the first sentence, then the return contract. The field enumeration is dense but each item carries actual information; only the timezone sentence is slightly compressed in a way that reads as shorthand.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must describe return contents — and it does, listing the meaningful fields plus timezone and recurrence semantics. Combined with readOnlyHint, an agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema has no descriptions, so the description must carry the parameter meaning — and it does, explaining that event_id reads an event while message_id reads an invitation, with a mutual-exclusion rule ('exactly one'). It doesn't state id formats or what happens if both or neither are supplied at runtime.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read an event') and covers both retrieval modes: by event_id or by message_id for an invitation. This is clearly distinguishable from list_events, list_events_delta, and find_event_by_key, which operate on keys or collections rather than a single id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'exactly one' constraint tells the agent how to invoke but not when to choose this tool over siblings such as outlook_find_event_by_key or outlook_read_message. Usage is implied by the id types rather than stated with explicit alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_get_mail_tipsBRead-only
Pre-send check for recipients: out-of-office, delivery limits, mailbox-full warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| emails | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe, non-mutating call, so the bar is lower. The description adds real value by naming the categories of information returned, which compensates somewhat for the missing output schema, but it says nothing about behavior with invalid addresses, maximum recipient count, or partial/empty results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded clause with zero filler; the core purpose and the returned tip categories both land immediately. It reads as a fragment rather than a sentence, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, low-complexity read tool this covers the essentials, and with no output schema the tip-category list usefully sketches what comes back. It still leaves the agent guessing about result structure and edge cases, so it is adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single required parameter, so the description must carry the load. "Recipients" loosely implies the array holds email addresses, but it never confirms the expected format (SMTP address vs. UPN vs. display name), accepted count limits, or duplicate handling.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific operation (a pre-send check) on a specific resource (recipients) and enumerates the tip categories returned (out-of-office, delivery limits, mailbox-full). It is clearly distinct from sibling send tools such as outlook_send_message or outlook_reply, though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Pre-send check" implies the usage context — call this before sending — but the description never states that explicitly, never names outlook_send_message/outlook_reply as the tools it precedes, and gives no when-not-to-use guidance (e.g., for internal-only batches).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_get_taskARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | No | ||
| task_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares this a safe read, so the bar is lower; the description still adds real context by naming the returned fields and explaining that `checklist_items` are ordered unchecked-first to match the To Do client. It does not cover failure behavior (e.g., missing task_id or list_id), which is the only notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with what is returned and immediately followed by the sibling routing rule. Every sentence carries distinct information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by listing the returned fields, and the checklist ordering note prevents misinterpretation of results. Only error/not-found behavior and `task_id` format are unaddressed, which is a minor gap for a two-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate — and it does for `list_id` by stating it is only required for non-default lists, plus it maps the notes field to `body`. `task_id` is left implicit as the obvious identifier, which is acceptable but not fully documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get full To Do task details') and enumerates the fields returned: notes (`body`), checklist items, due, recurrence flag. It also names the sibling outlook_list_tasks, so the agent can distinguish single-task retrieval from list overviews 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use this for one task's sub-steps and notes; use outlook_list_tasks for overviews.' It also gives the condition for the optional parameter ('`list_id` is only needed when the task lives in a non-default list'), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_list_attachmentsBRead-only
List attachments on a message — returns IDs, names, sizes, and content types.
| Name | Required | Description | Default |
|---|---|---|---|
| message_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that this is a safe read operation. The description adds useful behavioral context by stating the return fields (IDs, names, sizes, content types), but it does not mention pagination, permissions, empty-result behavior, or what happens if the message has no attachments.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is a single front-loaded sentence with no wasted words. The action and return contents are stated immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with a readOnlyHint and no output schema, the description covers the purpose and return fields reasonably well. However, it leaves gaps around how to obtain message_id and edge-case behavior, so it is only minimally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does little to compensate. It implies that message_id identifies the message, but it does not explain the expected ID format, where to obtain the ID, or any constraints on the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a clear verb and resource: 'List attachments on a message.' It also states the return fields, which helps distinguish it from download_attachment and from task-attachment siblings. It does not explicitly name an alternative, but the message-scoped listing action is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance and no mention of alternatives such as outlook_download_attachment. The agent must infer usage entirely from the tool name and the fact that it returns attachment metadata.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_list_calendarsARead-only
List all calendars available to the authenticated user (primary + secondary).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the bar is lower. The description adds one useful behavioral fact — that both primary and secondary calendars come back — but says nothing about ordering, paging, or what identifying fields (IDs, names) each entry carries, which matters since downstream tools need a calendar ID.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the scope qualifier front-loaded after the verb; no filler, no restatement of the tool name beyond what is needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only enumeration tool with annotations covering safety and no output schema to worry about, the description is nearly sufficient. The one missing piece is that the returned entries carry the calendar identifiers other tools require.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. The description's parenthetical about primary + secondary calendars is a reasonable stand-in for parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (calendars) plus the scope of what is returned (primary + secondary calendars of the authenticated user). It is clearly distinct from siblings like outlook_list_events, though it never explicitly contrasts itself with the event-listing tools an agent might reach for instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus outlook_list_events, outlook_list_folders, or the calendar-ID-dependent creation tools. The agent must infer that this is a discovery/disambiguation step before listing or creating events.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_list_categoriesARead-only
List the user's master category definitions (names + colors).
Provides the valid values for outlook_categorize_message.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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 the meaningful detail that the returned set is the master category list with colors, but says nothing about empty-list behavior, whether defaults are included, or ordering. With annotations covering the safety profile, that 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences: the first states what is returned, the second states what it is for. Nothing is repeated from the schema or annotations, and the payoff line is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Simple read-only, zero-argument tool with no output schema, so the description's summary of the return shape does real work. A note about default categories or an empty result would close the last gap, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema carries no semantic load and the baseline of 4 applies. The description correctly does not waste space inventing parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('list the user's master category definitions') and even enumerates the payload ('names + colors'). It also names the sibling tool that consumes this data, so an agent can place it precisely among the many outlook_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second line gives a concrete usage trigger: fetch these values before calling outlook_categorize_message. It stops short of explicit when-not guidance or noting that this is a discovery step only, but the relational context is unusually clear for a no-argument tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_list_contactsARead-only
List contacts with cursor pagination.
Use for one-shot queries; use outlook_list_contacts_delta for polling/recurring agents.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| cursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the bar is lower. The description adds that results are cursor-paginated, which is useful behavioral context, but says nothing about ordering, what a page contains, or how to detect the end of results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the core purpose and the routing rule both front-loaded. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with no output schema this is nearly enough, but the completely undocumented parameters leave the agent guessing about page sizing and cursor reuse. A single clause on 'count' and cursor round-tripping would close the gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 only gestures at 'cursor pagination' without explaining that the cursor is the token returned by a prior call, and it says nothing at all about 'count' (default 25, any max).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List contacts') plus the pagination mechanism, and explicitly contrasts itself with the sibling outlook_list_contacts_delta. An agent can distinguish it from the delta variant 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use rule ('one-shot queries') and names the alternative with the condition that selects it ('polling/recurring agents'). Nothing is left to inference about routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_list_contacts_deltaARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | ||
| delta_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=true in annotations, the description supplies substantial operational context beyond the annotation: delta-token flow, tombstone handling for is_deleted=True items, and immediate draining when has_more=True. These are concrete behavioral details an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then usage/alternative, then a compact example and edge-case behavior. Every sentence earns its place and adds operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a delta-polling read tool with no output schema, the description covers the key return signals: is_deleted tombstones, has_more draining, and delta_token reuse. It is not fully complete because page_size behavior remains undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the two parameters. The description fully explains delta_token, including the no-argument first call and passing the prior token back, but it never explains page_size or its pagination implications, so compensation is only partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: list contact changes since the last call. It explicitly distinguishes this from outlook_list_contacts, making the delta/list split clear without requiring schema inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the intended use case (polling/recurring agents) and the alternative (outlook_list_contacts for one-shot queries). It also gives the first-call/next-call sequence and explains how to handle has_more=True.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_list_draftsBRead-only
List messages in the Drafts folder with cursor pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| cursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the description only needs to add context; it adds that results are cursor-paginated. It does not disclose sort order, whether drafts include their attachment/recipient summaries, or how the count default of 25 behaves at the boundary.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single twelve-word sentence with the resource stated first and the pagination trait appended. Nothing is redundant and nothing is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with no output schema and light annotations, the missing pieces are what a returned draft record looks like and how to detect the last page. The definition is adequate to call the tool but not to use the results confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 partially does: 'cursor pagination' hints that cursor is an opaque continuation token. The count parameter (default 25, no stated maximum or ordering semantics) is left entirely undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (messages in the Drafts folder), so an agent can distinguish it from outlook_list_inbox and outlook_search_mail by folder scope. It stops short of explicitly naming 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the resource scope: an agent can infer this is the enumeration step before outlook_update_draft, outlook_send_draft, or outlook_delete_draft, but no sentence says so. There are no explicit when/when-not conditions or named alternatives such as search_mail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_list_eventsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| after | No | ||
| count | No | ||
| before | No | ||
| cursor | No | ||
| concise | No | ||
| calendar | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, so the description carries real weight and delivers: recurring-instance expansion, the exact field set concise mode drops and adds, and the is_online → is_online_meeting rename. The cursor continuation rule ('continues the listing it came from') is behavior an agent cannot infer from any structured field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then routing, then the parameter notes — a sensible order with no filler sentences. The concise-mode sentence is dense but every clause carries distinct field-level information. Minor cost: it is longer than it needs to be for a list operation, and the trailing `calendar`/cursor notes read as an afterthought block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description never characterizes the default event shape — only the deltas in concise mode — so an agent cannot anticipate what a normal result contains. Date-range semantics (default days=7, count=50 pagination behavior, whether a next cursor is returned) are also unstated, leaving real gaps for a 7-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 7 parameters. It does well on three: calendar (display name or ID from outlook_list_calendars, omit for default), concise (full field-level effects), and cursor (continuation semantics). It says nothing about days, after, before, or count — notably the interplay between the relative `days` window and the absolute `after`/`before` bounds, and what happens when both are supplied, is left entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource ('List calendar events') plus a scope qualifier ('in a date range') and a behavioral note that recurring instances are expanded. It also explicitly names the sibling it is not (outlook_list_events_delta), so an agent can route between the two 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States both when to use this tool ('one-shot queries') and when to use the alternative ('polling/recurring agents' → outlook_list_events_delta). It also gives a second conditional routing rule: pass concise=True for day-at-a-glance scans.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_list_events_deltaARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| start | No | ||
| page_size | No | ||
| delta_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, so the description carries most of the burden and delivers: cursor encoding the window, is_deleted tombstones, and the has_more drain instruction. It omits a critical delta-API behavior — what happens when delta_token is expired or invalid (full resync vs error) — which is the main operational risk here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence, then routing guidance, then a concrete two-call example that earns its place by showing the exact first/next invocation pattern. Minor redundancy between the prose statement that start/end are first-call-only and the example, and the hard-wrapped lines make it slightly longer than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param tool with no output schema and no schema descriptions, the description covers the incremental cursor lifecycle, tombstone semantics, and pagination draining — enough to call it correctly. Missing page_size guidance and expired-token/error behavior keep it short of full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, and it does for three of four params: start/end are ISO 8601 and required on the first call only, and delta_token is the cursor that supersedes the window. page_size is never mentioned despite influencing the has_more drain loop.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List only calendar event changes within a window since the last call') and immediately distinguishes itself from the sibling outlook_list_events. An agent can tell incremental-sync semantics apart from a one-shot list 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the target scenario ('polling/recurring agents') and the alternative ('Use outlook_list_events for one-shot queries'), with a cost comparison to justify the choice. The when/when-not split is fully resolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_list_foldersARead-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, each folder with the
path that folder arguments accept.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | ||
| recursive | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already declaring a safe read operation, the description adds useful behavior: default top-level scope, recursive full-tree behavior, and the path output relevant to folder arguments. It omits pagination/cursor behavior and does not clarify whether counts are total or unread, but it adds meaningful context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two compact sentences, front-loaded with the core operation and return fields, followed by the key recursive behavior. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool with no output schema, it covers the main behavior, default scope, recursion, and important returned fields. It is not fully complete because cursor/pagination semantics are absent and the meaning of message counts is not specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate for undocumented parameters. It explains recursive well, including the default and effect, but cursor is completely unmentioned, leaving one of two parameters without any semantic guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource, 'List mail folders', and names returned fields including message counts, parent_id, and child count. It is clearly a read/list operation, distinguishing it implicitly from folder mutation siblings, but it does not explicitly differentiate itself from tools like outlook_list_inbox or outlook_list_thread.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context for the recursive parameter: default is top-level only, and recursive=True walks the full tree. It does not name alternative tools or conditions for choosing this over list-inbox-style siblings, so it is clear but not fully comparative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_list_inboxARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | ||
| after | No | ||
| count | No | ||
| before | No | ||
| cursor | No | ||
| folder | No | inbox | |
| concise | No | ||
| unread_only | No | ||
| from_address | No | ||
| classification | No | ||
| uncategorized_only | No |
TDQS
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 real behavioral value beyond that — concise=True drops preview/categories for ~10x fewer tokens, uncategorized_only filters to uncategorized messages, and relative date offsets are spelled out. It does not explain pagination semantics (skip vs cursor) or what the result envelope looks like, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then routing, then parameter guidance, then a concrete example. Every sentence carries distinct information; the token-cost and date-format tips are compactly stated with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-param read tool with no output schema and no annotation detail beyond readOnlyHint, the definition covers routing, the trickiest parameters, and a token-saving mode. It stops short on pagination (cursor/skip interplay) and on what a returned message contains beyond the mention of preview/categories fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage the description carries the full burden, and it delivers for the highest-value params: folder accepts display names, well-known names, or Graph IDs (prefer names), after/before accept ISO 8601 or relative offsets like `7d`/`+7d`, plus concise and uncategorized_only semantics, with a worked example showing unread_only and count. Four params — skip, cursor, from_address, and classification — get no explanation at all, which is the remaining gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource ('List messages in one folder') and immediately scopes the filter set (read, sender, date, category, Focused). It explicitly distinguishes itself from sibling tools outlook_search_mail and outlook_list_inbox_delta, so an agent can route 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use routing: folder-scoped browsing here, KQL full-text via outlook_search_mail, polling/recurring via outlook_list_inbox_delta with a concrete cost rationale (10x cheaper after first call). Alternatives and the condition selecting each are named, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_list_inbox_deltaARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | inbox | |
| page_size | No | ||
| delta_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds substantive behavior beyond that: the ~10x cost advantage after the first call, the tombstone semantics of is_deleted=True, and the requirement to drain immediately when has_more=True. These are non-obvious operational traits an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core scope statement, then cost rationale, then a concrete example, then edge-case flags. Every sentence carries distinct information; the repeated delta_token mention in the example and the has_more line serve different purposes (syntax vs. control flow).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description responsibly discloses the key response fields (delta_token, is_deleted, has_more) and how to act on them. The gap is minor: folder and page_size behavior is never described, so a caller cannot tell how scoping or paging interacts with delta tracking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 delta_token thoroughly via the example sequence, but folder (default 'inbox') and page_size (default 50) are never mentioned, leaving two of three parameters undocumented anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with an explicit scope qualifier ('List only inbox changes since the last call'), which immediately separates it from a full snapshot. It also names the sibling it replaces, outlook_list_inbox, so the agent can distinguish them 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes when to use it ('polling/recurring agents') and when not ('Use outlook_list_inbox for one-shot snapshots'), naming the alternative. The concrete first-call/next-call example removes any remaining ambiguity about how to sequence calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_list_inbox_overridesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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 conceptual value by explaining that an override forces a sender into Focused or Other regardless of Graph's inference, which is non-obvious domain semantics. It stops short of describing the returned record shape, ordering, or what an empty result means, so it is a solid but not rich addition over 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and resource, followed by only the definitional context an agent needs to interpret the result. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-param, read-only list with full annotation coverage and no output schema, the description covers what the tool returns conceptually. The only gap is that it does not sketch the returned fields (sender plus routing target) or confirm behavior when no overrides exist — minor for this complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema imposes no documentation burden and the baseline of 4 applies. Nothing in the description is needed to disambiguate inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('List the user's Focused Inbox per-sender override rules') and the second sentence pins down what an override actually is. It is clearly distinguishable from siblings such as outlook_list_inbox, outlook_set_inbox_override and outlook_delete_inbox_override, though it never explicitly names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the resource name — an agent should call this when it needs to know the current sender-based routing rules — but there is no explicit when-to-use, no mention of pairing with outlook_set_inbox_override to change a rule, and no note on whether this is a prerequisite for reclassification decisions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_list_task_attachmentsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| cursor | No | ||
| list_id | No | ||
| task_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already establishes the safety profile, so the description focuses on what it uniquely can add: the pagination contract (has_more=True → pass next_cursor back). That is genuinely useful behavioral detail beyond the annotation. It stops short of stating ordering, page-size behavior, or what an empty result means.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, each doing distinct work: what it returns, which sibling to call next, and how to paginate. The pagination rule is front-loaded where an agent will hit it immediately after the first call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, naming the returned fields and the has_more/next_cursor contract is sufficient to interpret results. However, for a four-parameter tool with zero schema coverage, the undocumented `list_id` and `count` leave a real gap in how to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 partly does: it explains the cursor/next_cursor round-trip and implies the required task_id. Neither `count` (default 25) nor `list_id` — the latter being a non-obvious scoping parameter — is mentioned anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List attachments on a To Do task') and even enumerates the returned fields (id, name, size, content_type). The 'To Do task' qualifier distinguishes it from the mail-attachment sibling `outlook_list_attachments`, so an agent can select it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear downstream context — use `outlook_download_task_attachment` with an id from this list to fetch content — which is the main reason to call this tool. It describes pagination handling but offers no explicit when-not-to-use guidance or prerequisites (e.g., task must have an attachment present).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_list_task_listsARead-only
List all Microsoft To Do task lists for the current user.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes the safety profile, so the description only needs to add scope, which it does with 'for the current user' (no user parameter needed). It does not mention pagination, ordering, or what a returned list entry looks like, leaving moderate behavioral gaps for a list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler, and the resource plus scope are both front-loaded. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter read tool with annotations covering safety, this is close to sufficient; the caller knows what it retrieves and on whose behalf. It stops short of noting anything about result volume or pagination, which is the only real gap given there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which is the baseline-4 case. The phrase 'for the current user' usefully confirms that identity is implicit in the auth context rather than being a filter the caller must supply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'List all Microsoft To Do task lists' names the exact entity, and 'for the current user' bounds the scope. It is not explicitly distinguished from the nearby outlook_list_tasks sibling (tasks vs. task lists), so the agent must infer the difference from the names alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: enumerating lists is obviously the precursor to listing or creating tasks, but the description never says when to call this versus outlook_list_tasks or names any alternative. No prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_list_tasksCRead-only
List tasks in a To Do list with optional status filter.
status: "notStarted", "inProgress", or "completed".
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| cursor | No | ||
| status | No | ||
| list_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safety profile, so the bar is lower. The description adds the valid status vocabulary, which is genuinely beyond the annotations, but says nothing about pagination behavior, default page size, or how count/cursor interact — meaningful gaps for a read tool returning pageable results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short lines, front-loaded with the operation and scope, with the enum values isolated for quick scanning. Minor waste in restating the parameter name twice, but nothing bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter tool with zero schema coverage and no output schema, the description covers only one parameter's value space. Without any explanation of list_id provenance or paging via count/cursor, an agent cannot reliably construct a correct call from this alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry all four parameters. It documents only `status` (with values absent from the schema, a real addition) and leaves `list_id`, `count`, and `cursor` entirely unexplained — notably `list_id`, whose origin in outlook_list_task_lists an agent would never learn from either field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List tasks in a To Do list') and confines scope to a single list, which distinguishes it implicitly from outlook_list_task_lists. It doesn't explicitly name that sibling or note that it does not return the lists themselves, so sibling differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no exclusions, no mention of alternatives such as outlook_get_task for a single task or outlook_list_task_lists for enumerating lists. The optional status filter hints at a use case but never states it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_list_threadARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| concise | No | ||
| conversation_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that this is a safe read operation. The description adds useful behavioral context: chronological ordering and the token-saving effect of concise=True, which drops quoted prior-message text from previews.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded, and wastes no words. The prerequisite and the important concise flag are both easy to find.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with no output schema, the description covers the key usage context, required identifier source, and concise mode. The main gap is the undocumented count parameter, but the definition is otherwise sufficient to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 where conversation_id comes from and what concise does, but it does not explain the count parameter or its default behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: list all messages in a conversation thread, returned in chronological order. This clearly distinguishes it from reading a single message or listing an inbox.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a clear prerequisite: the conversation_id must come from a message's metadata. It also gives guidance on using concise=True for long reply chains, though it does not explicitly name alternatives or exclusion cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_mark_readAIdempotent
Mark a single message as read or unread (set is_read=True or False).
| Name | Required | Description | Default |
|---|---|---|---|
| is_read | Yes | ||
| message_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-destructive, idempotent mutation, and the description is consistent with that. It adds the detail that the operation works on a single message and toggles is_read, but says nothing about permissions, return values, or error cases beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The parenthetical clarifies the parameter without repeating the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation with annotations covering safety and idempotency, the description is nearly sufficient. It could mention that message_id identifies an Outlook message, but not much an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 usefully defines is_read=True/False semantics, but says nothing about message_id format or source. That covers one of two parameters, leaving a meaningful gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: marking a single message as read or unread, with the boolean toggle made explicit. It contrasts implicitly with read/list siblings by saying 'mark' rather than 'read', though it does not name an alternative tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: this is the tool for changing read state on one message. There is no explicit when-to-use guidance, no exclusion for bulk operations like batch_triage, and no alternative named.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | Yes | ||
| message_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=false and destructiveHint=false, but the description adds important behavior: moving removes the message from the source folder, and deletion should use a different tool. It does not cover error behavior or permissions, but with annotations providing the safety profile this is a meaningful addition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core move semantics, then efficiently covers alternatives and folder naming. Every sentence adds useful routing or parameter information without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter move tool with annotations and no output schema, the description covers the essential behavior, alternatives, and folder naming rules. Minor gaps such as message ID format or destination-folder existence requirements remain, but no critical information for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 strongly documents the `folder` parameter by explaining accepted display names, well-known names, Graph IDs, and a preference for names; `message_id` is not described but its meaning is self-evident from the name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: move a message to another folder, and immediately clarifies that this removes it from the source. It explicitly distinguishes the tool from outlook_copy_message and outlook_delete_message, so an agent can select it without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing guidance: use outlook_copy_message to duplicate without removal, and use outlook_delete_message for deletion rather than moving to deleteditems. This directly answers when to use this tool versus its closest alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_read_messageARead-only
Get one full message by ID or Message-ID (<abc@example.com>).
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.
include_sender_auth=True adds sender_authentication: did Microsoft verify the From domain?
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | text | |
| concise | No | ||
| message_id | Yes | ||
| include_sender_auth | No | ||
| include_deferred_send | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already covers the safety profile, and the description goes beyond it: concise mode drops body/body_html and returns a 200-char body_preview at roughly 10x token savings, and two flags add specific response fields (deferred_send_datetime, sender_authentication). It does not cover error behavior for an unknown message_id or whether reading affects read state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose sentence first, then one short clause per parameter, zero filler. Each sentence carries information not present in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and empty parameter descriptions, the description supplies the identifier formats, the format enumeration, and the return-field consequences of each flag — enough to invoke it correctly and interpret the response. Remaining unknowns (not-found errors, read-state side effects) are minor and partly covered by readOnlyHint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and does: message_id accepts an ID or a `<abc@example.com>` Message-ID, format accepts the otherwise-unenumerated values "text"/"html"/"full", and all three booleans are explained by their effect. This is exactly the compensation the metric rewards when structured fields are empty.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Get one full message') plus the two accepted identifier forms, so it is clearly the single-message fetch. It never names a sibling, so the distinction from `outlook_read_messages` (plural/batch) or `outlook_list_thread` must be inferred from the word 'one'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives conditional guidance for each optional flag: concise=True for triage scans, include_deferred_send when recreating a delayed draft, include_sender_auth when From-domain verification matters. No explicit exclusions or named alternatives for the tool itself, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_read_messagesARead-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, include_sender_auth). 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).
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | text | |
| concise | No | ||
| message_ids | Yes | ||
| include_sender_auth | No | ||
| include_deferred_send | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, it discloses partial-failure behavior: 404s are surfaced in failures without failing the whole call. It also specifies ordering, return keys, and the batch size cap, which are useful operational traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core bulk-read behavior, then adds ordering, return shape, partial-failure semantics, and an example without wasting space. The structure supports quick scanning and the example is directly useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a batch read tool with no output schema, it explains the return envelope and partial-failure behavior well. It is not fully complete because the optional parameters remain opaque at 0% schema description coverage, relying on the sibling read tool for their meaning.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the schema itself documents none of the five parameters. The description clarifies message_ids, cap, and ordering, and says the optional flags mirror outlook_read_message, but it does not explain format values, what concise changes, or what the two include flags include.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: bulk-read messages by ID via $batch. It also explicitly distinguishes itself from the sibling outlook_read_message by telling the agent to use this instead of N single-message calls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description names the intended use case (reading multiple messages by ID), the alternative to avoid (N outlook_read_message calls), and the hard cap of 20. That is enough for an agent to select this tool correctly when it already has IDs.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| message_id | Yes | ||
| classification | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a non-read-only but non-destructive mutation. The description adds useful scope detail: it affects exactly ONE message's placement and does not create a future-facing sender rule. It does not describe permissions, reversibility, or response behavior, so it falls short of full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded, and every sentence adds value. It states the core action first, then gives the key parameter constraint and the sibling routing guidance without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation with annotations covering safety, the description provides enough context to select and invoke the tool correctly. It could be slightly more complete by mentioning return behavior or error conditions, but those are minor for this operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 does document the critical allowed values for `classification` ("focused" or "other"), but it does not explain the expected format or semantics of `message_id`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: reclassifying one message's Focused/Other placement. It also distinguishes the tool from the sibling outlook_set_inbox_override by contrasting single-message repair with a sticky future-message rule.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool to fix a single message and directs the agent to outlook_set_inbox_override when the intent is a sticky rule for future messages from the same sender. The when-to-use and alternative conditions are both clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_remove_draft_attachmentADestructive
Remove a single attachment from a draft message by attachment ID.
| Name | Required | Description | Default |
|---|---|---|---|
| draft_id | Yes | ||
| attachment_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true, and the description aligns by saying it removes an attachment. It adds the useful detail that only a single attachment is removed from a draft, but does not describe irreversibility, error behavior, or permission requirements 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with the action and target front-loaded; every phrase contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter destructive mutation with annotations covering the safety profile, the description is minimally adequate. It does not explain how to obtain the IDs or what happens if the attachment or draft is missing, which would help an agent invoke it reliably.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 that attachment_id identifies the attachment and that the operation targets a draft, but it does not explain draft_id, ID formats, or where those IDs come from.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (remove a single attachment) and scopes it to a draft message, which clearly distinguishes it from attach_to_draft and from event-attachment removal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The operation is intuitively implied by the description, but it does not state when to use this tool versus alternatives such as deleting the whole draft or listing attachments first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_remove_event_attachmentADestructive
Remove one attachment from an event (IDs from outlook_get_event's attachments).
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | ||
| attachment_id | Yes |
TDQS
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 destructive write. The description adds that exactly one attachment is removed and where to source its ID, but says nothing about irreversibility, permissions, or the effect on the event 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the key provenance detail in parentheses; every clause earns its place and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter destructive mutation with no output schema, the description covers what is removed and where IDs come from. It could add a note on irreversibility or what happens if the attachment ID is stale, but annotations already flag the destructive nature.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, and it does meaningfully for attachment_id by pointing to outlook_get_event's `attachments` field. event_id is only named, not explained (format, calendar scope), leaving a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove one attachment from an event'), which unambiguously identifies a mutation on an event's attachment. It does not explicitly contrast with the counterpart sibling outlook_attach_to_event or with update_event replacement, so sibling differentiation is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical gives useful context on where the IDs come from (outlook_get_event's `attachments`), but there is no explicit when-to-use/when-not guidance or named alternative (e.g., removing all attachments requires a different path). Usage is implied by the 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_rename_folderAIdempotent
Rename a user-created mail folder by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| folder_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that this is a non-read-only, idempotent, non-destructive mutation. The description adds a meaningful constraint that only user-created folders can be renamed, but it does not mention required permissions, name conflict behavior, or what happens to messages in the folder.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. Every word contributes to identifying the action, resource, and scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The operation is simple and annotations cover the safety profile, but with zero schema description coverage the description should do more to explain the two required parameters. It also omits error behavior for system folders or invalid IDs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and both parameters are required. The description only implies that folder_id identifies the folder and that name is the new name, without explaining name constraints, folder ID source, or uniqueness behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Rename') and resource ('user-created mail folder') with scope ('by ID'). This clearly distinguishes it from sibling folder tools such as create_folder, delete_folder, and list_folders.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'user-created mail folder' implies this is not for system folders, giving useful usage context. However, there is no explicit when-to-use guidance, no alternatives named, and no mention of what to do if the folder does not exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_replyBDestructive
Reply (or reply-all) to an email message.
Use this for email; use outlook_rsvp for calendar meeting invites.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| is_html | No | ||
| reply_all | No | ||
| message_id | Yes | ||
| is_markdown | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, but the description adds nothing about what actually happens: whether the reply is sent immediately and irreversibly, whether it lands in Sent Items, or what permissions are needed. The one implied behavior (reply-all) comes only from the baked-in parenthetical, not from real disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core action front-loaded and the sibling routing second. Nothing is padded, though brevity here edges toward under-specification rather than efficient communication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter mutation tool with no output schema and an irreversible send action, the description is far too thin. It leaves the agent without send semantics, parameter meanings, or result expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 burden for five parameters. It only hints at reply_all; message_id, body, is_html and is_markdown are left entirely undocumented, and the precedence/relationship between is_html and is_markdown is unresolved.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (reply / reply-all) and resource (email message), and explicitly separates itself from the calendar RSVP sibling. It does not differentiate from the other send-side siblings like outlook_forward or outlook_send_message, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule: use this for email, use outlook_rsvp for calendar invites. That is clear usage context, though it offers no exclusions or guidance for the closely related forward/send_message tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_rsvpADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| message | No | ||
| event_id | Yes | ||
| response | Yes |
TDQS
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 carried structurally. The description adds nothing beyond that: it doesn't say that a response is sent to the organizer, that "decline" may remove the event from the calendar, or whether an RSVP can be changed afterward — meaningful gaps given destructiveHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the action and its allowed values front-loaded and the disambiguation trailing. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with no output schema and no documented return behavior, the description covers the response values but says nothing about where event_id is obtained (siblings outlook_list_events / outlook_get_event exist) or what message does. Adequate to avoid a wrong tool choice, but not complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and no enums are defined, so the description's enumeration of accept/decline/tentative is genuinely load-bearing and prevents an invalid call. However, `event_id` (where does it come from?) and the optional `message` (a note to the organizer?) are left entirely undefined, so it only half compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ("RSVP to a calendar meeting invite") and immediately constrains the operation with the three legal `response` values. It also names the sibling it is not (outlook_reply) for a regular email 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the positive case ("Use this for meeting invites") and the alternative explicitly ("use outlook_reply to reply to a regular email message"), which is exactly the confusion an agent would face given how many mail-reply siblings exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_search_contactsARead-only
Search contacts by name or email using KQL query syntax.
phone (instead of query) finds a number written any way, with or without country code.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| phone | No | ||
| query | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares this is a safe read. The description adds genuine behavioral detail about phone matching (any formatting, optional country code), but says nothing about result ordering, pagination, truncation, or what happens when a broad KQL query returns many matches.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the primary search behavior front-loaded and the phone special case immediately after. No filler; the only slight awkwardness is the parenthetical '(instead of query)' interrupting the second sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter, read-only search with no output schema, the definition covers the core intent and the one non-obvious parameter interaction. The undocumented 'count' is the only real omission, which is a minor gap rather than a blocker to correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. It does well for 'query' (name/email + KQL) and 'phone' (format-insensitive matching), but 'count' — which has a default of 25 and no documented maximum — is never mentioned, leaving a third of the parameters unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search contacts') plus the matching field ('by name or email') and the query language (KQL). It does not explicitly contrast with siblings like outlook_list_contacts or outlook_get_contact, so the agent must infer search-vs-enumerate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives a real routing rule: use 'phone' instead of 'query' when looking for a number. But there is no guidance on when to search versus listing contacts, and no note on prerequisites or what to do when no match is found.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_search_mailARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| query | Yes | ||
| cursor | No | ||
| folder | No | ||
| concise | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint already declaring safety, the description adds genuinely non-obvious behavior: uppercase-only operators, lowercase `and` matching as a literal, and implicit broadening of adjacent terms. It omits any mention of result ordering or how `cursor` pages through results, which matters for a search that can exceed `count`.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the sibling distinction, then example, then syntax pitfalls, then the token-saving tip — a sensible priority order. Each sentence carries distinct information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the `concise` note implicitly tells the agent what fields come back, and the KQL guidance covers the hard part of invocation. The unexplained `cursor` and undocumented `count` default leave paging behavior underspecified for a tool that clearly returns paginated results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full documentation burden, and it does well for three of five parameters: `query` (KQL fields, operator list, examples), `folder` (implicit scoping), and `concise` (drops preview/categories, ~10x token savings). `cursor` is never mentioned and `count` only appears incidentally in the example with no default or max, leaving meaningful gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Full-text search mail with KQL') plus its scope ('across all folders, or one if `folder` is set'). It explicitly contrasts itself with outlook_list_inbox, so an agent can distinguish the two 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('find emails about X') and names the alternative with the condition that selects it ('use outlook_list_inbox for structured filters scoped to a single folder'). The decision rule is complete and requires no inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_send_draftADestructive
Send an existing draft (pair with outlook_create_draft for human-review send flow).
| Name | Required | Description | Default |
|---|---|---|---|
| draft_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation risk is communicated structurally and the description does not contradict it. However, the description adds nothing about the irreversible nature of sending, whether the draft is consumed/removed afterward, or what happens if draft_id is stale — meaningful context for a send operation that would have earned a higher score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, verb-first, with the workflow hint in parentheses so it can be skipped by an agent that already knows the pattern. Every clause earns its place with no preamble.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with annotations covering the safety profile and no output schema, the essentials are present. Still missing is post-send behavior (does the draft disappear from outlook_list_drafts?) and failure modes for an invalid or already-sent draft_id, which matter for a destructive action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single draft_id parameter has 0% schema description coverage, so the description carries the burden. 'Existing draft' does convey that the id must reference a pre-created draft, and the outlook_create_draft pairing hints at provenance, but it never says how to obtain a valid draft_id (e.g. via outlook_list_drafts) or what format it takes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Send an existing draft'. The qualifier 'existing' implicitly separates it from outlook_send_message and outlook_send_with_attachments, which compose new mail, but the siblings are never named so the agent must 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical gives a concrete workflow: pair with outlook_create_draft for a human-review send flow, which tells the agent this is the second half of a two-step pattern. It stops short of an explicit exclusion (e.g. 'use outlook_send_message instead when no draft exists'), so the guidance is clear context rather than full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_send_messageADestructive
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).
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | ||
| to | Yes | ||
| bcc | No | ||
| body | Yes | ||
| is_html | No | ||
| subject | Yes | ||
| reply_to | No | ||
| importance | No | normal | |
| is_markdown | No | ||
| request_read_receipt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description reinforces that with "immediately, no human review" — meaningful because it tells the agent the commit is irreversible and unrecoverable. It doesn't note the absence of an attachment mechanism (which forces an agent to outlook_send_with_attachments) or any send rate/quota limits, so it stops just short of full coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, none wasted: the commit semantics lead, alternatives follow, and the parameter note closes. Every sentence conveys a routing or safety decision the agent must make before calling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The safety and routing picture is complete, and no output schema exists so return values need no explanation. However, for a 10-parameter mutation with 0% schema documentation, the description should at least flag that attachments require outlook_send_with_attachments and give minimal guidance on body formatting flags.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 10 parameters, so the description carries the entire burden — yet it only explains reply_to (routing replies to a shared alias, a genuinely useful clarification). To, cc, bcc, is_html, is_markdown, importance, and request_read_receipt are left completely unexplained, including the format-selection ambiguity between is_html and is_markdown.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Send an email immediately, no human review" gives a specific verb (send), resource (email), and execution semantic (immediate, unreviewed). It is immediately distinguishable from the draft-based siblings it names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes away to alternatives with conditions: human-review workflows → outlook_create_draft + outlook_send_draft; existing threads → outlook_reply; invites → outlook_rsvp. It also disambiguates the sibling outlook_send_draft, which an agent could easily confuse with this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_send_with_attachmentsADestructive
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. attachments: inline files [{name, content_base64, content_type?}], up to
3MB each. Pass reply_to to route replies to a different address.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | ||
| to | Yes | ||
| bcc | No | ||
| body | Yes | ||
| is_html | No | ||
| subject | Yes | ||
| reply_to | No | ||
| importance | No | normal | |
| attachments | No | ||
| attachment_paths | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this as non-read-only and destructive, and the description adds meaningful behavioral context: automatic upload-session switching for large files, path resolution confined to the attachments directory, refusal of outside paths, and a 3MB inline-attachment limit. It does not mention return behavior or authentication requirements, but it adds substantial 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then gives attachment-specific constraints in compact, purpose-driven sentences. There is little wasted text, and each sentence adds operational detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter send tool with no output schema and no annotation-level detail beyond destructive hints, the description covers the most complex attachment behaviors but leaves several parameters and the return/result shape undocumented. It is adequate for attachment handling but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 for parameter meaning. It explains the tricky parameters well—attachment_paths resolution, inline attachments structure and size limit, and reply_to routing—but does not cover importance values, is_html behavior, or the conventional recipient/body fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: send an email with file attachments. It clearly distinguishes itself from the general send tool by emphasizing attachments, though it does not explicitly name outlook_send_message as the no-attachment alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the attachment focus and the >3MB upload-session behavior, but the description does not explicitly say when to use this versus outlook_send_message, outlook_create_draft, or outlook_send_draft. The attachment-source rules are helpful but are constraints rather than alternative-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_set_inbox_overrideAIdempotent
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".
| Name | Required | Description | Default |
|---|---|---|---|
| classify_as | Yes | ||
| sender_email | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false, so the safety profile is covered; the description adds real context beyond that by clarifying upsert semantics ('created' vs 'updated'), stickiness, and case-insensitive matching. It does not mention permission requirements or how the rule relates to existing Focused/Other state, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no waste: definition first, disambiguation second, example and return shape last. Front-loaded and every sentence adds decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter tool with no output schema, the description covers what it does, when to prefer it, and what it returns (status: created/updated). The remaining gap is the classify_as value set, which the schema leaves as an unconstrained string.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry parameter meaning, and it only partly does: the example clarifies sender_email usage and shows classify_as="other", and 'case-insensitive' attaches to sender matching. It never enumerates the legal values for classify_as (e.g., whether "focused" is valid alongside "other"), which is the main ambiguity an agent would hit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: create/update a sticky Focused/Other rule for a sender, and explicitly frames it as an upsert with case-insensitive matching. The Focused/Other classification scope distinguishes it from generic message tooling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this for FUTURE messages and names the sibling outlook_reclassify_message for fixing ONE existing message, so the selection rule between the two is unambiguous. It also states the permanence of the effect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_update_checklist_itemAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | No | ||
| task_id | Yes | ||
| is_checked | No | ||
| display_name | No | ||
| checklist_item_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare non-read-only, idempotent, and non-destructive behavior, so the description's job is to add context. It usefully adds that this is a partial patch—only provided fields change—and that Graph maintains the checked timestamp when is_checked=True. It does not discuss permissions or error behavior, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is two short sentences, front-loads the core action and partial-patch constraint, and every clause adds useful behavior or parameter guidance. There is no wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter mutation tool with no schema descriptions and no output schema, the description gives enough to understand the operation and two fields but is incomplete on the identifier parameters. An agent still has to infer what list_id, task_id, and checklist_item_id mean and how they relate. The annotations cover safety, but parameter completeness remains a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 explains is_checked and display_name but leaves list_id, task_id, and checklist_item_id unexplained, including how list_id relates to task_id and checklist_item_id. That is insufficient compensation for five undocumented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Update a checklist item') and adds the partial-patch behavior, which clearly distinguishes it from delete/add checklist-item siblings by verb. It does not explicitly route between update_task, complete_task, and this checklist-item-specific update, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains how the two main fields are used: is_checked for marking a sub-step done and display_name for renaming. However, it does not state when to use this tool versus update_task or complete_task, nor does it give exclusions or prerequisites.
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. phone_type ("mobile", "business", "home") picks the field; business/home REPLACE that list. clear_phones empties those types: phone_type="business", clear_phones=["mobile"] moves it. title is the name prefix ("Dr.", "Ms."), shown in the display name — not the job. birthday is a date, YYYY-MM-DD. categories REPLACES the whole list ([] clears it). email REPLACES every address; add_emails/remove_emails change only those (3 at most).
| Name | Required | Description | Default |
|---|---|---|---|
| No | |||
| phone | No | ||
| title | No | ||
| company | No | ||
| birthday | No | ||
| job_title | No | ||
| last_name | No | ||
| add_emails | No | ||
| categories | No | ||
| contact_id | Yes | ||
| first_name | No | ||
| phone_type | No | mobile | |
| middle_name | No | ||
| clear_phones | No | ||
| home_address | No | ||
| other_address | No | ||
| remove_emails | No | ||
| personal_notes | No | ||
| business_address | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly=false and destructiveHint=false, and the description adds substantial behavioral nuance: address replacement, list replacement/clearing, phone-type moves, and email add/remove limits. It does not cover permissions, error behavior, or the return shape, but it is strong for an update tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded and each sentence earns its place by explaining a specific field behavior or replacement rule. There is no filler, and the partial-patch constraint is stated before the detailed parameter rules.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter mutation tool with no output schema, the description covers the tricky mutation semantics and data-loss risks well. It is not fully exhaustive across every parameter and does not describe return behavior, but it is complete enough to invoke the tool safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. It does this well for the non-obvious and high-risk parameters: address shape and replacement, phone_type/clear_phones behavior, title-vs-job_title, birthday format, and categories/email replacement semantics. It leaves several simple fields (first_name, last_name, company, personal_notes) unexplained, but those are largely self-evident.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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") plus the important scope ("partial patch — only provided fields change"). This clearly distinguishes it from create_contact without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context is clear: use this to update an already-existing contact, and only provided fields change. It does not explicitly say when not to use it or route the agent to get_contact/create_contact for related tasks, so it falls 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_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.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | ||
| to | No | ||
| body | No | ||
| is_html | No | ||
| subject | No | ||
| draft_id | Yes | ||
| reply_to | No | ||
| is_markdown | No | ||
| deferred_send_datetime | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the bar is lower, and the description still adds real behavioral value: it discloses the consumer-Outlook constraint that a Text-over-HTML PATCH is rejected, and it explains how to clear fields (reply_to=[], empty string). It does not say what the response contains or whether the draft id changes, but the operational gotchas are well surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then a short set of parameter-specific lines, each of which adds a distinct rule. No filler, though it reads as a parameter cheat-sheet rather than a fully organized overview.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation tool with 0% schema coverage and no output schema, the description covers the trickiest parameters but leaves the recipient/subject fields and especially is_markdown undocumented, and never describes the return value. Adequate to call correctly in the common case, incomplete for the full surface.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, and it does explain is_html, reply_to, and deferred_send_datetime semantics including clearing behavior. However, six parameters (body, to, cc, subject, draft_id, is_markdown) get no mention, and the is_html/is_markdown interaction is left undefined, so compensation is only partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 draft') plus the key modifier '(partial patch)', which tells an agent this is a merge rather than a replace. It does not explicitly name the sibling draft tools (create_draft, send_draft, delete_draft) it contrasts with, but the verb+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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The '(partial patch)' phrasing implies only supplied fields are changed, which is useful usage context, but there is no explicit when-to-use vs. alternatives guidance (e.g., use create_draft for new drafts, send_draft to dispatch). Usage is inferable from the name rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_update_eventADestructive
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.
key patches on its own too.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| key | No | ||
| body | No | ||
| start | No | ||
| show_as | No | ||
| subject | No | ||
| event_id | Yes | ||
| location | No | ||
| timezone | No | ||
| attendees | No | ||
| is_all_day | No | ||
| recurrence | No | ||
| remove_recurrence | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only destructiveHint=true to rely on, the description discloses real side effects: attendees sends invitations and cancellations, [] removes everyone, recurrence edits convert single↔series, and series patches are refused when occurrences were edited or deleted. It also explains that False and [] are instructions rather than absences — exactly the semantic an agent would otherwise get wrong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core patch semantic, then organized by parameter in a scannable way. It is long and dense, but nearly every sentence carries a non-obvious constraint; minor redundancy around the mutual-exclusivity of recurrence and remove_recurrence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter destructive mutation with no output schema and 0% schema coverage, the description covers the semantics an agent needs to call it safely, including failure conditions (series with edited occurrences) and side effects (invitations, cancellations). Nothing critical is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load, and it does for the tricky parameters: recurrence shapes, attendees replacement and invitation side effects, is_all_day's midnight/same-call constraint, timezone re-anchoring, and that show_as and key patch standalone. It adds no detail for subject, body, location, or event_id, but those are self-evident.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update fields on an existing event') and immediately qualifies the semantics with 'partial patch — only provided fields change'. This clearly separates it from outlook_create_event and outlook_delete_event without needing to open a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong conditional guidance throughout: omit recurrence to leave it alone, pass remove_recurrence=True to break a series, attendees replaces the whole list, is_all_day requires start/end. It stops short of naming sibling alternatives explicitly (e.g. 'use outlook_create_event for new events'), so it is context-rich but not a full when/when-not/alternatives map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_update_taskB
Update fields on a To Do task (partial patch — only provided fields change).
| Name | Required | Description | Default |
|---|---|---|---|
| due | No | ||
| body | No | ||
| title | No | ||
| list_id | No | ||
| task_id | Yes | ||
| importance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive mutation. The description adds the genuinely useful PATCH semantics (only supplied fields change), but says nothing about permissions, whether null/empty values clear a field, or whether omitted fields are preserved server-side.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler that carries the most important non-obvious fact (partial patch) first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, no parameter descriptions, and no annotations covering side effects, the definition leaves too much undefined for a 6-parameter mutation: field formats, list_id reassignment semantics, and error behavior are all absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 6 parameters, so the description needs to compensate but does not. It never mentions the patchable fields (title, body, due, importance, list_id) or formats such as the expected date format or valid importance values; only the generic 'provided fields change' rule is stated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (To Do task) plus the key qualifier that this is a partial patch. It is distinguishable from outlook_create_task / outlook_delete_task, though the boundary with outlook_complete_task is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus outlook_complete_task (set completed status) or when not to use it. Usage is only inferable from the tool name.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | No | ||
| task_id | Yes | ||
| file_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false), and the description adds real value beyond that: base64 inline upload, a hard 20 MiB ceiling with the reasoning (30 MB Graph body cap, 4/3 inflation), and up-front refusal rather than failure mid-request. It still leaves out permission requirements and what a successful response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then the size contract, then the rationale for the ceiling. Every sentence earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should say what comes back (attachment id/metadata) and how list_id interacts with task_id. It covers the upload mechanics and limits well but leaves the agent guessing on the response shape and one of three parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 it explains only file_path (resolved inside the configured attachments directory). task_id and the optional list_id are left entirely undocumented, so it only partially compensates for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Attach') plus resource ('a local file to a To Do task') and the mechanism (inline base64 POST), which cleanly separates it from the sibling attach tools (outlook_attach_to_draft, outlook_attach_to_event) by target resource alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the 20 MiB ceiling tells the agent when this tool will refuse, but there is no explicit statement of when to prefer it over the attachments alternatives or what prerequisites (task existence, scope) are required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outlook_whoamiARead-only
Get the authenticated user's profile (display name, email, ID).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read. In the absence of an output schema, the description's one added behavioral fact is the shape of the return payload (display name, email, ID), which is genuinely useful; it says nothing about what happens when unauthenticated or on token failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero filler, front-loaded with the verb and resource and ending with the concrete return fields. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a trivial, parameterless identity read with readOnlyHint covering safety and no output schema, naming the returned fields largely satisfies the description's burden. A note on behavior when no valid credential exists would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the description correctly offers none, so there is nothing to mis-specify. Baseline of 4 for a 0-param tool applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Get the authenticated user's profile') with the returned fields enumerated in parentheses. It does not, however, distinguish itself from the sibling outlook_auth_status, which plausibly overlaps in telling the caller about the current session/user.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no prerequisites (e.g., must be authenticated), and no mention of outlook_auth_status as a related or alternative tool. The agent must infer the use case from the word 'authenticated' alone.
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.
71 tool updates
v1.30.2- Changed
outlook_add_checklist_item7 fields changed- removed
Input schema / properties / display_name / titleRemoved value: -"Display Name" - removed
Input schema / properties / list_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / list_id / defaultRemoved value: -null - removed
Input schema / properties / list_id / titleRemoved value: -"List Id" - added
Input schema / properties / list_id / typeAdded value: +"string" - removed
Input schema / properties / task_id / titleRemoved value: -"Task Id" - removed
Input schema / titleRemoved value: -"outlook_add_checklist_itemArguments"
- Changed
outlook_attach_to_draft12 fields changed- removed
Input schema / properties / attachment_paths / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / attachment_paths / defaultRemoved value: -null - added
Input schema / properties / attachment_paths / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / attachment_paths / titleRemoved value: -"Attachment Paths" - added
Input schema / properties / attachment_paths / typeAdded value: +"array" - removed
Input schema / properties / attachments / anyOfRemoved value: -[ - { - "items": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / attachments / defaultRemoved value: -null - added
Input schema / properties / attachments / itemsAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "type": "object" +} - removed
Input schema / properties / attachments / titleRemoved value: -"Attachments" - added
Input schema / properties / attachments / typeAdded value: +"array" - removed
Input schema / properties / draft_id / titleRemoved value: -"Draft Id" - removed
Input schema / titleRemoved value: -"outlook_attach_to_draftArguments"
- Changed
outlook_attach_to_event3 fields changed- removed
Input schema / properties / attachment_paths / titleRemoved value: -"Attachment Paths" - removed
Input schema / properties / event_id / titleRemoved value: -"Event Id" - removed
Input schema / titleRemoved value: -"outlook_attach_to_eventArguments"
- Changed
outlook_auth_status1 field changed- removed
Input schema / titleRemoved value: -"outlook_auth_statusArguments"
- Changed
outlook_batch_triage4 fields changed- removed
Input schema / properties / action / titleRemoved value: -"Action" - removed
Input schema / properties / message_ids / titleRemoved value: -"Message Ids" - removed
Input schema / properties / value / titleRemoved value: -"Value" - removed
Input schema / titleRemoved value: -"outlook_batch_triageArguments"
- Changed
outlook_categorize_message3 fields changed- removed
Input schema / properties / categories / titleRemoved value: -"Categories" - removed
Input schema / properties / message_id / titleRemoved value: -"Message Id" - removed
Input schema / titleRemoved value: -"outlook_categorize_messageArguments"
- Changed
outlook_changes_since7 fields changed- added
Input schema / properties / delta_tokens / additionalPropertiesAdded value: +true - removed
Input schema / properties / delta_tokens / anyOfRemoved value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -] - removed
Input schema / properties / delta_tokens / defaultRemoved value: -null - removed
Input schema / properties / delta_tokens / titleRemoved value: -"Delta Tokens" - added
Input schema / properties / delta_tokens / typeAdded value: +"object" - removed
Input schema / properties / fallback_window_hours / titleRemoved value: -"Fallback Window Hours" - removed
Input schema / titleRemoved value: -"outlook_changes_sinceArguments"
- Changed
outlook_complete_task6 fields changed- removed
Input schema / properties / list_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / list_id / defaultRemoved value: -null - removed
Input schema / properties / list_id / titleRemoved value: -"List Id" - added
Input schema / properties / list_id / typeAdded value: +"string" - removed
Input schema / properties / task_id / titleRemoved value: -"Task Id" - removed
Input schema / titleRemoved value: -"outlook_complete_taskArguments"
- Changed
outlook_copy_message3 fields changed- removed
Input schema / properties / folder / titleRemoved value: -"Folder" - removed
Input schema / properties / message_id / titleRemoved value: -"Message Id" - removed
Input schema / titleRemoved value: -"outlook_copy_messageArguments"
- Changed
outlook_create_contact44 fields changed- removed
Input schema / properties / birthday / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / birthday / defaultRemoved value: -null - removed
Input schema / properties / birthday / titleRemoved value: -"Birthday" - added
Input schema / properties / birthday / typeAdded value: +"string" - removed
Input schema / properties / categories / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / categories / defaultRemoved value: -null - added
Input schema / properties / categories / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / categories / titleRemoved value: -"Categories" - added
Input schema / properties / categories / typeAdded value: +"array" - removed
Input schema / properties / company / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / company / defaultRemoved value: -null - removed
Input schema / properties / company / titleRemoved value: -"Company" - added
Input schema / properties / company / typeAdded value: +"string" - removed
Input schema / properties / email / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / email / defaultRemoved value: -null - removed
Input schema / properties / email / titleRemoved value: -"Email" - added
Input schema / properties / email / typeAdded value: +"string" - removed
Input schema / properties / first_name / titleRemoved value: -"First Name" - removed
Input schema / properties / job_title / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / job_title / defaultRemoved value: -null - removed
Input schema / properties / job_title / titleRemoved value: -"Job Title" - added
Input schema / properties / job_title / typeAdded value: +"string" - removed
Input schema / properties / last_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / last_name / defaultRemoved value: -null - removed
Input schema / properties / last_name / titleRemoved value: -"Last Name" - added
Input schema / properties / last_name / typeAdded value: +"string" - removed
Input schema / properties / middle_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / middle_name / defaultRemoved value: -null - removed
Input schema / properties / middle_name / titleRemoved value: -"Middle Name" - added
Input schema / properties / middle_name / typeAdded value: +"string" - removed
Input schema / properties / personal_notes / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / personal_notes / defaultRemoved value: -null - removed
Input schema / properties / personal_notes / titleRemoved value: -"Personal Notes" - added
Input schema / properties / personal_notes / typeAdded value: +"string" - removed
Input schema / properties / phone / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / phone / defaultRemoved value: -null - removed
Input schema / properties / phone / titleRemoved value: -"Phone" - added
Input schema / properties / phone / typeAdded value: +"string" - removed
Input schema / properties / phone_type / titleRemoved value: -"Phone Type" - removed
Input schema / properties / title / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / title / defaultRemoved value: -null - removed
Input schema / properties / title / titleRemoved value: -"Title" - added
Input schema / properties / title / typeAdded value: +"string" - removed
Input schema / titleRemoved value: -"outlook_create_contactArguments"
- Changed
outlook_create_draft42 fields changed- removed
Input schema / properties / bcc / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / bcc / defaultRemoved value: -null - added
Input schema / properties / bcc / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / bcc / titleRemoved value: -"Bcc" - added
Input schema / properties / bcc / typeAdded value: +"array" - removed
Input schema / properties / body / titleRemoved value: -"Body" - removed
Input schema / properties / cc / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / cc / defaultRemoved value: -null - added
Input schema / properties / cc / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / cc / titleRemoved value: -"Cc" - added
Input schema / properties / cc / typeAdded value: +"array" - removed
Input schema / properties / deferred_send_datetime / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / deferred_send_datetime / defaultRemoved value: -null - removed
Input schema / properties / deferred_send_datetime / titleRemoved value: -"Deferred Send Datetime" - added
Input schema / properties / deferred_send_datetime / typeAdded value: +"string" - removed
Input schema / properties / forward_message_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / forward_message_id / defaultRemoved value: -null - removed
Input schema / properties / forward_message_id / titleRemoved value: -"Forward Message Id" - added
Input schema / properties / forward_message_id / typeAdded value: +"string" - removed
Input schema / properties / importance / titleRemoved value: -"Importance" - removed
Input schema / properties / is_html / titleRemoved value: -"Is Html" - removed
Input schema / properties / is_markdown / titleRemoved value: -"Is Markdown" - removed
Input schema / properties / reply_all / titleRemoved value: -"Reply All" - removed
Input schema / properties / reply_to / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / reply_to / defaultRemoved value: -null - added
Input schema / properties / reply_to / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / reply_to / titleRemoved value: -"Reply To" - added
Input schema / properties / reply_to / typeAdded value: +"array" - removed
Input schema / properties / reply_to_message_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / reply_to_message_id / defaultRemoved value: -null - removed
Input schema / properties / reply_to_message_id / titleRemoved value: -"Reply To Message Id" - added
Input schema / properties / reply_to_message_id / typeAdded value: +"string" - removed
Input schema / properties / subject / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / subject / defaultRemoved value: -null - removed
Input schema / properties / subject / titleRemoved value: -"Subject" - added
Input schema / properties / subject / typeAdded value: +"string" - removed
Input schema / properties / to / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / to / defaultRemoved value: -null - added
Input schema / properties / to / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / to / titleRemoved value: -"To" - added
Input schema / properties / to / typeAdded value: +"array" - removed
Input schema / titleRemoved value: -"outlook_create_draftArguments"
- Changed
outlook_create_event38 fields changed- removed
Input schema / properties / attendees / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / attendees / defaultRemoved value: -null - added
Input schema / properties / attendees / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / attendees / titleRemoved value: -"Attendees" - added
Input schema / properties / attendees / typeAdded value: +"array" - removed
Input schema / properties / body / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / body / defaultRemoved value: -null - removed
Input schema / properties / body / titleRemoved value: -"Body" - added
Input schema / properties / body / typeAdded value: +"string" - removed
Input schema / properties / calendar / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / calendar / defaultRemoved value: -null - removed
Input schema / properties / calendar / titleRemoved value: -"Calendar" - added
Input schema / properties / calendar / typeAdded value: +"string" - removed
Input schema / properties / end / titleRemoved value: -"End" - removed
Input schema / properties / is_all_day / titleRemoved value: -"Is All Day" - removed
Input schema / properties / is_online / titleRemoved value: -"Is Online" - removed
Input schema / properties / key / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / key / defaultRemoved value: -null - removed
Input schema / properties / key / titleRemoved value: -"Key" - added
Input schema / properties / key / typeAdded value: +"string" - removed
Input schema / properties / location / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / location / defaultRemoved value: -null - removed
Input schema / properties / location / titleRemoved value: -"Location" - added
Input schema / properties / location / typeAdded value: +"string" - changed
Input schema / properties / recurrence / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "string" + } +] - removed
Input schema / properties / recurrence / defaultRemoved value: -null - removed
Input schema / properties / recurrence / titleRemoved value: -"Recurrence" - removed
Input schema / properties / show_as / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / show_as / defaultRemoved value: -null - removed
Input schema / properties / show_as / titleRemoved value: -"Show As" - added
Input schema / properties / show_as / typeAdded value: +"string" - removed
Input schema / properties / start / titleRemoved value: -"Start" - removed
Input schema / properties / subject / titleRemoved value: -"Subject" - removed
Input schema / properties / timezone / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / timezone / defaultRemoved value: -null - removed
Input schema / properties / timezone / titleRemoved value: -"Timezone" - added
Input schema / properties / timezone / typeAdded value: +"string" - removed
Input schema / titleRemoved value: -"outlook_create_eventArguments"
- Changed
outlook_create_folder6 fields changed- removed
Input schema / properties / name / titleRemoved value: -"Name" - removed
Input schema / properties / parent_folder / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / parent_folder / defaultRemoved value: -null - removed
Input schema / properties / parent_folder / titleRemoved value: -"Parent Folder" - added
Input schema / properties / parent_folder / typeAdded value: +"string" - removed
Input schema / titleRemoved value: -"outlook_create_folderArguments"
- Changed
outlook_create_task27 fields changed- removed
Input schema / properties / body / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / body / defaultRemoved value: -null - removed
Input schema / properties / body / titleRemoved value: -"Body" - added
Input schema / properties / body / typeAdded value: +"string" - removed
Input schema / properties / due / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / due / defaultRemoved value: -null - removed
Input schema / properties / due / titleRemoved value: -"Due" - added
Input schema / properties / due / typeAdded value: +"string" - removed
Input schema / properties / importance / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / importance / defaultRemoved value: -null - removed
Input schema / properties / importance / titleRemoved value: -"Importance" - added
Input schema / properties / importance / typeAdded value: +"string" - removed
Input schema / properties / list_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / list_id / defaultRemoved value: -null - removed
Input schema / properties / list_id / titleRemoved value: -"List Id" - added
Input schema / properties / list_id / typeAdded value: +"string" - added
Input schema / properties / recurrence / additionalPropertiesAdded value: +true - removed
Input schema / properties / recurrence / anyOfRemoved value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -] - removed
Input schema / properties / recurrence / defaultRemoved value: -null - removed
Input schema / properties / recurrence / titleRemoved value: -"Recurrence" - added
Input schema / properties / recurrence / typeAdded value: +"object" - removed
Input schema / properties / reminder / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Input schema / properties / reminder / defaultRemoved value: -null - removed
Input schema / properties / reminder / titleRemoved value: -"Reminder" - added
Input schema / properties / reminder / typeAdded value: +"boolean" - removed
Input schema / properties / title / titleRemoved value: -"Title" - removed
Input schema / titleRemoved value: -"outlook_create_taskArguments"
- Changed
outlook_delete_checklist_item7 fields changed- removed
Input schema / properties / checklist_item_id / titleRemoved value: -"Checklist Item Id" - removed
Input schema / properties / list_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / list_id / defaultRemoved value: -null - removed
Input schema / properties / list_id / titleRemoved value: -"List Id" - added
Input schema / properties / list_id / typeAdded value: +"string" - removed
Input schema / properties / task_id / titleRemoved value: -"Task Id" - removed
Input schema / titleRemoved value: -"outlook_delete_checklist_itemArguments"
- Changed
outlook_delete_contact2 fields changed- removed
Input schema / properties / contact_id / titleRemoved value: -"Contact Id" - removed
Input schema / titleRemoved value: -"outlook_delete_contactArguments"
- Changed
outlook_delete_draft2 fields changed- removed
Input schema / properties / draft_id / titleRemoved value: -"Draft Id" - removed
Input schema / titleRemoved value: -"outlook_delete_draftArguments"
- Changed
outlook_delete_event2 fields changed- removed
Input schema / properties / event_id / titleRemoved value: -"Event Id" - removed
Input schema / titleRemoved value: -"outlook_delete_eventArguments"
- Changed
outlook_delete_folder2 fields changed- removed
Input schema / properties / folder_id / titleRemoved value: -"Folder Id" - removed
Input schema / titleRemoved value: -"outlook_delete_folderArguments"
- Changed
outlook_delete_inbox_override2 fields changed- removed
Input schema / properties / override_id / titleRemoved value: -"Override Id" - removed
Input schema / titleRemoved value: -"outlook_delete_inbox_overrideArguments"
- Changed
outlook_delete_message3 fields changed- removed
Input schema / properties / message_id / titleRemoved value: -"Message Id" - removed
Input schema / properties / permanent / titleRemoved value: -"Permanent" - removed
Input schema / titleRemoved value: -"outlook_delete_messageArguments"
- Changed
outlook_delete_task6 fields changed- removed
Input schema / properties / list_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / list_id / defaultRemoved value: -null - removed
Input schema / properties / list_id / titleRemoved value: -"List Id" - added
Input schema / properties / list_id / typeAdded value: +"string" - removed
Input schema / properties / task_id / titleRemoved value: -"Task Id" - removed
Input schema / titleRemoved value: -"outlook_delete_taskArguments"
- Changed
outlook_delete_task_attachment7 fields changed- removed
Input schema / properties / attachment_id / titleRemoved value: -"Attachment Id" - removed
Input schema / properties / list_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / list_id / defaultRemoved value: -null - removed
Input schema / properties / list_id / titleRemoved value: -"List Id" - added
Input schema / properties / list_id / typeAdded value: +"string" - removed
Input schema / properties / task_id / titleRemoved value: -"Task Id" - removed
Input schema / titleRemoved value: -"outlook_delete_task_attachmentArguments"
- Changed
outlook_download_attachment8 fields changed- removed
Input schema / properties / as_content / titleRemoved value: -"As Content" - removed
Input schema / properties / attachment_id / titleRemoved value: -"Attachment Id" - removed
Input schema / properties / message_id / titleRemoved value: -"Message Id" - removed
Input schema / properties / save_path / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save_path / defaultRemoved value: -null - removed
Input schema / properties / save_path / titleRemoved value: -"Save Path" - added
Input schema / properties / save_path / typeAdded value: +"string" - removed
Input schema / titleRemoved value: -"outlook_download_attachmentArguments"
- Changed
outlook_download_task_attachment12 fields changed- removed
Input schema / properties / as_content / titleRemoved value: -"As Content" - removed
Input schema / properties / attachment_id / titleRemoved value: -"Attachment Id" - removed
Input schema / properties / list_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / list_id / defaultRemoved value: -null - removed
Input schema / properties / list_id / titleRemoved value: -"List Id" - added
Input schema / properties / list_id / typeAdded value: +"string" - removed
Input schema / properties / save_path / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / save_path / defaultRemoved value: -null - removed
Input schema / properties / save_path / titleRemoved value: -"Save Path" - added
Input schema / properties / save_path / typeAdded value: +"string" - removed
Input schema / properties / task_id / titleRemoved value: -"Task Id" - removed
Input schema / titleRemoved value: -"outlook_download_task_attachmentArguments"
- Changed
outlook_find_event_by_key6 fields changed- removed
Input schema / properties / calendar / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / calendar / defaultRemoved value: -null - removed
Input schema / properties / calendar / titleRemoved value: -"Calendar" - added
Input schema / properties / calendar / typeAdded value: +"string" - removed
Input schema / properties / key / titleRemoved value: -"Key" - removed
Input schema / titleRemoved value: -"outlook_find_event_by_keyArguments"
- Changed
outlook_flag_message3 fields changed- removed
Input schema / properties / message_id / titleRemoved value: -"Message Id" - removed
Input schema / properties / status / titleRemoved value: -"Status" - removed
Input schema / titleRemoved value: -"outlook_flag_messageArguments"
- Changed
outlook_forward8 fields changed- removed
Input schema / properties / comment / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / comment / defaultRemoved value: -null - removed
Input schema / properties / comment / titleRemoved value: -"Comment" - added
Input schema / properties / comment / typeAdded value: +"string" - removed
Input schema / properties / is_markdown / titleRemoved value: -"Is Markdown" - removed
Input schema / properties / message_id / titleRemoved value: -"Message Id" - removed
Input schema / properties / to / titleRemoved value: -"To" - removed
Input schema / titleRemoved value: -"outlook_forwardArguments"
- Changed
outlook_get_contact2 fields changed- removed
Input schema / properties / contact_id / titleRemoved value: -"Contact Id" - removed
Input schema / titleRemoved value: -"outlook_get_contactArguments"
- Changed
outlook_get_event4 fields changed- removed
Input schema / properties / event_id / titleRemoved value: -"Event Id" - added
Input schema / properties / message_idAdded value: +{ + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "event_id" -] - removed
Input schema / titleRemoved value: -"outlook_get_eventArguments"
- Changed
outlook_get_mail_tips2 fields changed- removed
Input schema / properties / emails / titleRemoved value: -"Emails" - removed
Input schema / titleRemoved value: -"outlook_get_mail_tipsArguments"
- Changed
outlook_get_task6 fields changed- removed
Input schema / properties / list_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / list_id / defaultRemoved value: -null - removed
Input schema / properties / list_id / titleRemoved value: -"List Id" - added
Input schema / properties / list_id / typeAdded value: +"string" - removed
Input schema / properties / task_id / titleRemoved value: -"Task Id" - removed
Input schema / titleRemoved value: -"outlook_get_taskArguments"
- Changed
outlook_list_attachments2 fields changed- removed
Input schema / properties / message_id / titleRemoved value: -"Message Id" - removed
Input schema / titleRemoved value: -"outlook_list_attachmentsArguments"
- Changed
outlook_list_calendars1 field changed- removed
Input schema / titleRemoved value: -"outlook_list_calendarsArguments"
- Changed
outlook_list_categories1 field changed- removed
Input schema / titleRemoved value: -"outlook_list_categoriesArguments"
- Changed
outlook_list_contacts6 fields changed- removed
Input schema / properties / count / titleRemoved value: -"Count" - removed
Input schema / properties / cursor / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / cursor / defaultRemoved value: -null - removed
Input schema / properties / cursor / titleRemoved value: -"Cursor" - added
Input schema / properties / cursor / typeAdded value: +"string" - removed
Input schema / titleRemoved value: -"outlook_list_contactsArguments"
- Changed
outlook_list_contacts_delta6 fields changed- removed
Input schema / properties / delta_token / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / delta_token / defaultRemoved value: -null - removed
Input schema / properties / delta_token / titleRemoved value: -"Delta Token" - added
Input schema / properties / delta_token / typeAdded value: +"string" - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - removed
Input schema / titleRemoved value: -"outlook_list_contacts_deltaArguments"
- Changed
outlook_list_drafts6 fields changed- removed
Input schema / properties / count / titleRemoved value: -"Count" - removed
Input schema / properties / cursor / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / cursor / defaultRemoved value: -null - removed
Input schema / properties / cursor / titleRemoved value: -"Cursor" - added
Input schema / properties / cursor / typeAdded value: +"string" - removed
Input schema / titleRemoved value: -"outlook_list_draftsArguments"
- Changed
outlook_list_events20 fields changed- removed
Input schema / properties / after / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / after / defaultRemoved value: -null - removed
Input schema / properties / after / titleRemoved value: -"After" - added
Input schema / properties / after / typeAdded value: +"string" - removed
Input schema / properties / before / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / before / defaultRemoved value: -null - removed
Input schema / properties / before / titleRemoved value: -"Before" - added
Input schema / properties / before / typeAdded value: +"string" - removed
Input schema / properties / calendar / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / calendar / defaultRemoved value: -null - removed
Input schema / properties / calendar / titleRemoved value: -"Calendar" - added
Input schema / properties / calendar / typeAdded value: +"string" - removed
Input schema / properties / concise / titleRemoved value: -"Concise" - removed
Input schema / properties / count / titleRemoved value: -"Count" - removed
Input schema / properties / cursor / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / cursor / defaultRemoved value: -null - removed
Input schema / properties / cursor / titleRemoved value: -"Cursor" - added
Input schema / properties / cursor / typeAdded value: +"string" - removed
Input schema / properties / days / titleRemoved value: -"Days" - removed
Input schema / titleRemoved value: -"outlook_list_eventsArguments"
- Changed
outlook_list_events_delta14 fields changed- removed
Input schema / properties / delta_token / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / delta_token / defaultRemoved value: -null - removed
Input schema / properties / delta_token / titleRemoved value: -"Delta Token" - added
Input schema / properties / delta_token / typeAdded value: +"string" - removed
Input schema / properties / end / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / end / defaultRemoved value: -null - removed
Input schema / properties / end / titleRemoved value: -"End" - added
Input schema / properties / end / typeAdded value: +"string" - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - removed
Input schema / properties / start / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / start / defaultRemoved value: -null - removed
Input schema / properties / start / titleRemoved value: -"Start" - added
Input schema / properties / start / typeAdded value: +"string" - removed
Input schema / titleRemoved value: -"outlook_list_events_deltaArguments"
- Changed
outlook_list_folders6 fields changed- removed
Input schema / properties / cursor / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / cursor / defaultRemoved value: -null - removed
Input schema / properties / cursor / titleRemoved value: -"Cursor" - added
Input schema / properties / cursor / typeAdded value: +"string" - removed
Input schema / properties / recursive / titleRemoved value: -"Recursive" - removed
Input schema / titleRemoved value: -"outlook_list_foldersArguments"
- Changed
outlook_list_inbox27 fields changed- removed
Input schema / properties / after / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / after / defaultRemoved value: -null - removed
Input schema / properties / after / titleRemoved value: -"After" - added
Input schema / properties / after / typeAdded value: +"string" - removed
Input schema / properties / before / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / before / defaultRemoved value: -null - removed
Input schema / properties / before / titleRemoved value: -"Before" - added
Input schema / properties / before / typeAdded value: +"string" - removed
Input schema / properties / classification / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / classification / defaultRemoved value: -null - removed
Input schema / properties / classification / titleRemoved value: -"Classification" - added
Input schema / properties / classification / typeAdded value: +"string" - removed
Input schema / properties / concise / titleRemoved value: -"Concise" - removed
Input schema / properties / count / titleRemoved value: -"Count" - removed
Input schema / properties / cursor / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / cursor / defaultRemoved value: -null - removed
Input schema / properties / cursor / titleRemoved value: -"Cursor" - added
Input schema / properties / cursor / typeAdded value: +"string" - removed
Input schema / properties / folder / titleRemoved value: -"Folder" - removed
Input schema / properties / from_address / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / from_address / defaultRemoved value: -null - removed
Input schema / properties / from_address / titleRemoved value: -"From Address" - added
Input schema / properties / from_address / typeAdded value: +"string" - removed
Input schema / properties / skip / titleRemoved value: -"Skip" - removed
Input schema / properties / uncategorized_only / titleRemoved value: -"Uncategorized Only" - removed
Input schema / properties / unread_only / titleRemoved value: -"Unread Only" - removed
Input schema / titleRemoved value: -"outlook_list_inboxArguments"
- Changed
outlook_list_inbox_delta7 fields changed- removed
Input schema / properties / delta_token / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / delta_token / defaultRemoved value: -null - removed
Input schema / properties / delta_token / titleRemoved value: -"Delta Token" - added
Input schema / properties / delta_token / typeAdded value: +"string" - removed
Input schema / properties / folder / titleRemoved value: -"Folder" - removed
Input schema / properties / page_size / titleRemoved value: -"Page Size" - removed
Input schema / titleRemoved value: -"outlook_list_inbox_deltaArguments"
- Changed
outlook_list_inbox_overrides1 field changed- removed
Input schema / titleRemoved value: -"outlook_list_inbox_overridesArguments"
- Changed
outlook_list_task_attachments11 fields changed- removed
Input schema / properties / count / titleRemoved value: -"Count" - removed
Input schema / properties / cursor / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / cursor / defaultRemoved value: -null - removed
Input schema / properties / cursor / titleRemoved value: -"Cursor" - added
Input schema / properties / cursor / typeAdded value: +"string" - removed
Input schema / properties / list_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / list_id / defaultRemoved value: -null - removed
Input schema / properties / list_id / titleRemoved value: -"List Id" - added
Input schema / properties / list_id / typeAdded value: +"string" - removed
Input schema / properties / task_id / titleRemoved value: -"Task Id" - removed
Input schema / titleRemoved value: -"outlook_list_task_attachmentsArguments"
- Changed
outlook_list_task_lists1 field changed- removed
Input schema / titleRemoved value: -"outlook_list_task_listsArguments"
- Changed
outlook_list_tasks14 fields changed- removed
Input schema / properties / count / titleRemoved value: -"Count" - removed
Input schema / properties / cursor / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / cursor / defaultRemoved value: -null - removed
Input schema / properties / cursor / titleRemoved value: -"Cursor" - added
Input schema / properties / cursor / typeAdded value: +"string" - removed
Input schema / properties / list_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / list_id / defaultRemoved value: -null - removed
Input schema / properties / list_id / titleRemoved value: -"List Id" - added
Input schema / properties / list_id / typeAdded value: +"string" - removed
Input schema / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / status / defaultRemoved value: -null - removed
Input schema / properties / status / titleRemoved value: -"Status" - added
Input schema / properties / status / typeAdded value: +"string" - removed
Input schema / titleRemoved value: -"outlook_list_tasksArguments"
- Changed
outlook_list_thread4 fields changed- removed
Input schema / properties / concise / titleRemoved value: -"Concise" - removed
Input schema / properties / conversation_id / titleRemoved value: -"Conversation Id" - removed
Input schema / properties / count / titleRemoved value: -"Count" - removed
Input schema / titleRemoved value: -"outlook_list_threadArguments"
- Changed
outlook_mark_read3 fields changed- removed
Input schema / properties / is_read / titleRemoved value: -"Is Read" - removed
Input schema / properties / message_id / titleRemoved value: -"Message Id" - removed
Input schema / titleRemoved value: -"outlook_mark_readArguments"
- Changed
outlook_move_message3 fields changed- removed
Input schema / properties / folder / titleRemoved value: -"Folder" - removed
Input schema / properties / message_id / titleRemoved value: -"Message Id" - removed
Input schema / titleRemoved value: -"outlook_move_messageArguments"
- Changed
outlook_read_message6 fields changed- removed
Input schema / properties / concise / titleRemoved value: -"Concise" - removed
Input schema / properties / format / titleRemoved value: -"Format" - removed
Input schema / properties / include_deferred_send / titleRemoved value: -"Include Deferred Send" - removed
Input schema / properties / include_sender_auth / titleRemoved value: -"Include Sender Auth" - removed
Input schema / properties / message_id / titleRemoved value: -"Message Id" - removed
Input schema / titleRemoved value: -"outlook_read_messageArguments"
- Changed
outlook_read_messages6 fields changed- removed
Input schema / properties / concise / titleRemoved value: -"Concise" - removed
Input schema / properties / format / titleRemoved value: -"Format" - removed
Input schema / properties / include_deferred_send / titleRemoved value: -"Include Deferred Send" - removed
Input schema / properties / include_sender_auth / titleRemoved value: -"Include Sender Auth" - removed
Input schema / properties / message_ids / titleRemoved value: -"Message Ids" - removed
Input schema / titleRemoved value: -"outlook_read_messagesArguments"
- Changed
outlook_reclassify_message3 fields changed- removed
Input schema / properties / classification / titleRemoved value: -"Classification" - removed
Input schema / properties / message_id / titleRemoved value: -"Message Id" - removed
Input schema / titleRemoved value: -"outlook_reclassify_messageArguments"
- Changed
outlook_remove_draft_attachment3 fields changed- removed
Input schema / properties / attachment_id / titleRemoved value: -"Attachment Id" - removed
Input schema / properties / draft_id / titleRemoved value: -"Draft Id" - removed
Input schema / titleRemoved value: -"outlook_remove_draft_attachmentArguments"
- Changed
outlook_remove_event_attachment3 fields changed- removed
Input schema / properties / attachment_id / titleRemoved value: -"Attachment Id" - removed
Input schema / properties / event_id / titleRemoved value: -"Event Id" - removed
Input schema / titleRemoved value: -"outlook_remove_event_attachmentArguments"
- Changed
outlook_rename_folder3 fields changed- removed
Input schema / properties / folder_id / titleRemoved value: -"Folder Id" - removed
Input schema / properties / name / titleRemoved value: -"Name" - removed
Input schema / titleRemoved value: -"outlook_rename_folderArguments"
- Changed
outlook_reply6 fields changed- removed
Input schema / properties / body / titleRemoved value: -"Body" - removed
Input schema / properties / is_html / titleRemoved value: -"Is Html" - removed
Input schema / properties / is_markdown / titleRemoved value: -"Is Markdown" - removed
Input schema / properties / message_id / titleRemoved value: -"Message Id" - removed
Input schema / properties / reply_all / titleRemoved value: -"Reply All" - removed
Input schema / titleRemoved value: -"outlook_replyArguments"
- Changed
outlook_rsvp7 fields changed- removed
Input schema / properties / event_id / titleRemoved value: -"Event Id" - removed
Input schema / properties / message / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / message / defaultRemoved value: -null - removed
Input schema / properties / message / titleRemoved value: -"Message" - added
Input schema / properties / message / typeAdded value: +"string" - removed
Input schema / properties / response / titleRemoved value: -"Response" - removed
Input schema / titleRemoved value: -"outlook_rsvpArguments"
- Changed
outlook_search_contacts10 fields changed- removed
Input schema / properties / count / titleRemoved value: -"Count" - removed
Input schema / properties / phone / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / phone / defaultRemoved value: -null - removed
Input schema / properties / phone / titleRemoved value: -"Phone" - added
Input schema / properties / phone / typeAdded value: +"string" - removed
Input schema / properties / query / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / query / defaultRemoved value: -null - removed
Input schema / properties / query / titleRemoved value: -"Query" - added
Input schema / properties / query / typeAdded value: +"string" - removed
Input schema / titleRemoved value: -"outlook_search_contactsArguments"
- Changed
outlook_search_mail12 fields changed- removed
Input schema / properties / concise / titleRemoved value: -"Concise" - removed
Input schema / properties / count / titleRemoved value: -"Count" - removed
Input schema / properties / cursor / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / cursor / defaultRemoved value: -null - removed
Input schema / properties / cursor / titleRemoved value: -"Cursor" - added
Input schema / properties / cursor / typeAdded value: +"string" - removed
Input schema / properties / folder / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / folder / defaultRemoved value: -null - removed
Input schema / properties / folder / titleRemoved value: -"Folder" - added
Input schema / properties / folder / typeAdded value: +"string" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"outlook_search_mailArguments"
- Changed
outlook_send_draft2 fields changed- removed
Input schema / properties / draft_id / titleRemoved value: -"Draft Id" - removed
Input schema / titleRemoved value: -"outlook_send_draftArguments"
- Changed
outlook_send_message23 fields changed- removed
Input schema / properties / bcc / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / bcc / defaultRemoved value: -null - added
Input schema / properties / bcc / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / bcc / titleRemoved value: -"Bcc" - added
Input schema / properties / bcc / typeAdded value: +"array" - removed
Input schema / properties / body / titleRemoved value: -"Body" - removed
Input schema / properties / cc / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / cc / defaultRemoved value: -null - added
Input schema / properties / cc / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / cc / titleRemoved value: -"Cc" - added
Input schema / properties / cc / typeAdded value: +"array" - removed
Input schema / properties / importance / titleRemoved value: -"Importance" - removed
Input schema / properties / is_html / titleRemoved value: -"Is Html" - removed
Input schema / properties / is_markdown / titleRemoved value: -"Is Markdown" - removed
Input schema / properties / reply_to / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / reply_to / defaultRemoved value: -null - added
Input schema / properties / reply_to / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / reply_to / titleRemoved value: -"Reply To" - added
Input schema / properties / reply_to / typeAdded value: +"array" - removed
Input schema / properties / request_read_receipt / titleRemoved value: -"Request Read Receipt" - removed
Input schema / properties / subject / titleRemoved value: -"Subject" - removed
Input schema / properties / to / titleRemoved value: -"To" - removed
Input schema / titleRemoved value: -"outlook_send_messageArguments"
- Changed
outlook_send_with_attachments31 fields changed- removed
Input schema / properties / attachment_paths / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / attachment_paths / defaultRemoved value: -null - added
Input schema / properties / attachment_paths / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / attachment_paths / titleRemoved value: -"Attachment Paths" - added
Input schema / properties / attachment_paths / typeAdded value: +"array" - removed
Input schema / properties / attachments / anyOfRemoved value: -[ - { - "items": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / attachments / defaultRemoved value: -null - added
Input schema / properties / attachments / itemsAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "type": "object" +} - removed
Input schema / properties / attachments / titleRemoved value: -"Attachments" - added
Input schema / properties / attachments / typeAdded value: +"array" - removed
Input schema / properties / bcc / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / bcc / defaultRemoved value: -null - added
Input schema / properties / bcc / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / bcc / titleRemoved value: -"Bcc" - added
Input schema / properties / bcc / typeAdded value: +"array" - removed
Input schema / properties / body / titleRemoved value: -"Body" - removed
Input schema / properties / cc / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / cc / defaultRemoved value: -null - added
Input schema / properties / cc / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / cc / titleRemoved value: -"Cc" - added
Input schema / properties / cc / typeAdded value: +"array" - removed
Input schema / properties / importance / titleRemoved value: -"Importance" - removed
Input schema / properties / is_html / titleRemoved value: -"Is Html" - removed
Input schema / properties / reply_to / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / reply_to / defaultRemoved value: -null - added
Input schema / properties / reply_to / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / reply_to / titleRemoved value: -"Reply To" - added
Input schema / properties / reply_to / typeAdded value: +"array" - removed
Input schema / properties / subject / titleRemoved value: -"Subject" - removed
Input schema / properties / to / titleRemoved value: -"To" - removed
Input schema / titleRemoved value: -"outlook_send_with_attachmentsArguments"
- Changed
outlook_set_inbox_override3 fields changed- removed
Input schema / properties / classify_as / titleRemoved value: -"Classify As" - removed
Input schema / properties / sender_email / titleRemoved value: -"Sender Email" - removed
Input schema / titleRemoved value: -"outlook_set_inbox_overrideArguments"
- Changed
outlook_update_checklist_item15 fields changed- removed
Input schema / properties / checklist_item_id / titleRemoved value: -"Checklist Item Id" - removed
Input schema / properties / display_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / display_name / defaultRemoved value: -null - removed
Input schema / properties / display_name / titleRemoved value: -"Display Name" - added
Input schema / properties / display_name / typeAdded value: +"string" - removed
Input schema / properties / is_checked / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Input schema / properties / is_checked / defaultRemoved value: -null - removed
Input schema / properties / is_checked / titleRemoved value: -"Is Checked" - added
Input schema / properties / is_checked / typeAdded value: +"boolean" - removed
Input schema / properties / list_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / list_id / defaultRemoved value: -null - removed
Input schema / properties / list_id / titleRemoved value: -"List Id" - added
Input schema / properties / list_id / typeAdded value: +"string" - removed
Input schema / properties / task_id / titleRemoved value: -"Task Id" - removed
Input schema / titleRemoved value: -"outlook_update_checklist_itemArguments"
- Changed
outlook_update_contact78 fields changed- removed
Input schema / properties / add_emails / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / add_emails / defaultRemoved value: -null - added
Input schema / properties / add_emails / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / add_emails / titleRemoved value: -"Add Emails" - added
Input schema / properties / add_emails / typeAdded value: +"array" - removed
Input schema / properties / birthday / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / birthday / defaultRemoved value: -null - removed
Input schema / properties / birthday / titleRemoved value: -"Birthday" - added
Input schema / properties / birthday / typeAdded value: +"string" - added
Input schema / properties / business_address / additionalPropertiesAdded value: +true - removed
Input schema / properties / business_address / anyOfRemoved value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -] - removed
Input schema / properties / business_address / defaultRemoved value: -null - removed
Input schema / properties / business_address / titleRemoved value: -"Business Address" - added
Input schema / properties / business_address / typeAdded value: +"object" - removed
Input schema / properties / categories / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / categories / defaultRemoved value: -null - added
Input schema / properties / categories / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / categories / titleRemoved value: -"Categories" - added
Input schema / properties / categories / typeAdded value: +"array" - removed
Input schema / properties / clear_phones / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / clear_phones / defaultRemoved value: -null - added
Input schema / properties / clear_phones / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / clear_phones / titleRemoved value: -"Clear Phones" - added
Input schema / properties / clear_phones / typeAdded value: +"array" - removed
Input schema / properties / company / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / company / defaultRemoved value: -null - removed
Input schema / properties / company / titleRemoved value: -"Company" - added
Input schema / properties / company / typeAdded value: +"string" - removed
Input schema / properties / contact_id / titleRemoved value: -"Contact Id" - removed
Input schema / properties / email / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / email / defaultRemoved value: -null - removed
Input schema / properties / email / titleRemoved value: -"Email" - added
Input schema / properties / email / typeAdded value: +"string" - removed
Input schema / properties / first_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / first_name / defaultRemoved value: -null - removed
Input schema / properties / first_name / titleRemoved value: -"First Name" - added
Input schema / properties / first_name / typeAdded value: +"string" - added
Input schema / properties / home_address / additionalPropertiesAdded value: +true - removed
Input schema / properties / home_address / anyOfRemoved value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -] - removed
Input schema / properties / home_address / defaultRemoved value: -null - removed
Input schema / properties / home_address / titleRemoved value: -"Home Address" - added
Input schema / properties / home_address / typeAdded value: +"object" - removed
Input schema / properties / job_title / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / job_title / defaultRemoved value: -null - removed
Input schema / properties / job_title / titleRemoved value: -"Job Title" - added
Input schema / properties / job_title / typeAdded value: +"string" - removed
Input schema / properties / last_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / last_name / defaultRemoved value: -null - removed
Input schema / properties / last_name / titleRemoved value: -"Last Name" - added
Input schema / properties / last_name / typeAdded value: +"string" - removed
Input schema / properties / middle_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / middle_name / defaultRemoved value: -null - removed
Input schema / properties / middle_name / titleRemoved value: -"Middle Name" - added
Input schema / properties / middle_name / typeAdded value: +"string" - added
Input schema / properties / other_address / additionalPropertiesAdded value: +true - removed
Input schema / properties / other_address / anyOfRemoved value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -] - removed
Input schema / properties / other_address / defaultRemoved value: -null - removed
Input schema / properties / other_address / titleRemoved value: -"Other Address" - added
Input schema / properties / other_address / typeAdded value: +"object" - removed
Input schema / properties / personal_notes / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / personal_notes / defaultRemoved value: -null - removed
Input schema / properties / personal_notes / titleRemoved value: -"Personal Notes" - added
Input schema / properties / personal_notes / typeAdded value: +"string" - removed
Input schema / properties / phone / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / phone / defaultRemoved value: -null - removed
Input schema / properties / phone / titleRemoved value: -"Phone" - added
Input schema / properties / phone / typeAdded value: +"string" - removed
Input schema / properties / phone_type / titleRemoved value: -"Phone Type" - removed
Input schema / properties / remove_emails / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / remove_emails / defaultRemoved value: -null - added
Input schema / properties / remove_emails / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / remove_emails / titleRemoved value: -"Remove Emails" - added
Input schema / properties / remove_emails / typeAdded value: +"array" - removed
Input schema / properties / title / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / title / defaultRemoved value: -null - removed
Input schema / properties / title / titleRemoved value: -"Title" - added
Input schema / properties / title / typeAdded value: +"string" - removed
Input schema / titleRemoved value: -"outlook_update_contactArguments"
- Changed
outlook_update_draft31 fields changed- removed
Input schema / properties / body / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / body / defaultRemoved value: -null - removed
Input schema / properties / body / titleRemoved value: -"Body" - added
Input schema / properties / body / typeAdded value: +"string" - removed
Input schema / properties / cc / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / cc / defaultRemoved value: -null - added
Input schema / properties / cc / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / cc / titleRemoved value: -"Cc" - added
Input schema / properties / cc / typeAdded value: +"array" - removed
Input schema / properties / deferred_send_datetime / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / deferred_send_datetime / defaultRemoved value: -null - removed
Input schema / properties / deferred_send_datetime / titleRemoved value: -"Deferred Send Datetime" - added
Input schema / properties / deferred_send_datetime / typeAdded value: +"string" - removed
Input schema / properties / draft_id / titleRemoved value: -"Draft Id" - removed
Input schema / properties / is_html / titleRemoved value: -"Is Html" - removed
Input schema / properties / is_markdown / titleRemoved value: -"Is Markdown" - removed
Input schema / properties / reply_to / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / reply_to / defaultRemoved value: -null - added
Input schema / properties / reply_to / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / reply_to / titleRemoved value: -"Reply To" - added
Input schema / properties / reply_to / typeAdded value: +"array" - removed
Input schema / properties / subject / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / subject / defaultRemoved value: -null - removed
Input schema / properties / subject / titleRemoved value: -"Subject" - added
Input schema / properties / subject / typeAdded value: +"string" - removed
Input schema / properties / to / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / to / defaultRemoved value: -null - added
Input schema / properties / to / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / to / titleRemoved value: -"To" - added
Input schema / properties / to / typeAdded value: +"array" - removed
Input schema / titleRemoved value: -"outlook_update_draftArguments"
- Changed
outlook_update_event47 fields changed- removed
Input schema / properties / attendees / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / attendees / defaultRemoved value: -null - added
Input schema / properties / attendees / itemsAdded value: +{ + "type": "string" +} - removed
Input schema / properties / attendees / titleRemoved value: -"Attendees" - added
Input schema / properties / attendees / typeAdded value: +"array" - removed
Input schema / properties / body / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / body / defaultRemoved value: -null - removed
Input schema / properties / body / titleRemoved value: -"Body" - added
Input schema / properties / body / typeAdded value: +"string" - removed
Input schema / properties / end / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / end / defaultRemoved value: -null - removed
Input schema / properties / end / titleRemoved value: -"End" - added
Input schema / properties / end / typeAdded value: +"string" - removed
Input schema / properties / event_id / titleRemoved value: -"Event Id" - removed
Input schema / properties / is_all_day / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - removed
Input schema / properties / is_all_day / defaultRemoved value: -null - removed
Input schema / properties / is_all_day / titleRemoved value: -"Is All Day" - added
Input schema / properties / is_all_day / typeAdded value: +"boolean" - removed
Input schema / properties / key / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / key / defaultRemoved value: -null - removed
Input schema / properties / key / titleRemoved value: -"Key" - added
Input schema / properties / key / typeAdded value: +"string" - removed
Input schema / properties / location / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / location / defaultRemoved value: -null - removed
Input schema / properties / location / titleRemoved value: -"Location" - added
Input schema / properties / location / typeAdded value: +"string" - changed
Input schema / properties / recurrence / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "string" + } +] - removed
Input schema / properties / recurrence / defaultRemoved value: -null - removed
Input schema / properties / recurrence / titleRemoved value: -"Recurrence" - removed
Input schema / properties / remove_recurrence / titleRemoved value: -"Remove Recurrence" - removed
Input schema / properties / show_as / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / show_as / defaultRemoved value: -null - removed
Input schema / properties / show_as / titleRemoved value: -"Show As" - added
Input schema / properties / show_as / typeAdded value: +"string" - removed
Input schema / properties / start / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / start / defaultRemoved value: -null - removed
Input schema / properties / start / titleRemoved value: -"Start" - added
Input schema / properties / start / typeAdded value: +"string" - removed
Input schema / properties / subject / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / subject / defaultRemoved value: -null - removed
Input schema / properties / subject / titleRemoved value: -"Subject" - added
Input schema / properties / subject / typeAdded value: +"string" - removed
Input schema / properties / timezone / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / timezone / defaultRemoved value: -null - removed
Input schema / properties / timezone / titleRemoved value: -"Timezone" - added
Input schema / properties / timezone / typeAdded value: +"string" - removed
Input schema / titleRemoved value: -"outlook_update_eventArguments"
- Changed
outlook_update_task22 fields changed- removed
Input schema / properties / body / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / body / defaultRemoved value: -null - removed
Input schema / properties / body / titleRemoved value: -"Body" - added
Input schema / properties / body / typeAdded value: +"string" - removed
Input schema / properties / due / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / due / defaultRemoved value: -null - removed
Input schema / properties / due / titleRemoved value: -"Due" - added
Input schema / properties / due / typeAdded value: +"string" - removed
Input schema / properties / importance / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / importance / defaultRemoved value: -null - removed
Input schema / properties / importance / titleRemoved value: -"Importance" - added
Input schema / properties / importance / typeAdded value: +"string" - removed
Input schema / properties / list_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / list_id / defaultRemoved value: -null - removed
Input schema / properties / list_id / titleRemoved value: -"List Id" - added
Input schema / properties / list_id / typeAdded value: +"string" - removed
Input schema / properties / task_id / titleRemoved value: -"Task Id" - removed
Input schema / properties / title / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / title / defaultRemoved value: -null - removed
Input schema / properties / title / titleRemoved value: -"Title" - added
Input schema / properties / title / typeAdded value: +"string" - removed
Input schema / titleRemoved value: -"outlook_update_taskArguments"
- Changed
outlook_upload_task_attachment7 fields changed- removed
Input schema / properties / file_path / titleRemoved value: -"File Path" - removed
Input schema / properties / list_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / list_id / defaultRemoved value: -null - removed
Input schema / properties / list_id / titleRemoved value: -"List Id" - added
Input schema / properties / list_id / typeAdded value: +"string" - removed
Input schema / properties / task_id / titleRemoved value: -"Task Id" - removed
Input schema / titleRemoved value: -"outlook_upload_task_attachmentArguments"
- Changed
outlook_whoami1 field changed- removed
Input schema / titleRemoved value: -"outlook_whoamiArguments"
18 tool updates
v1.28.0- Changed
outlook_attach_to_draft6 fields changed- added
Input schema / properties / attachment_paths / anyOfAdded value: +[ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / attachment_paths / defaultAdded value: +null - removed
Input schema / properties / attachment_paths / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / attachment_paths / typeRemoved value: -"array" - added
Input schema / properties / attachmentsAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Attachments" +} - changed
Input schema / requiredPrevious value: -[ - "draft_id", - "attachment_paths" -]New value: +[ + "draft_id" +]
- Added
outlook_attach_to_event - Changed
outlook_create_draft12 fields changed- added
Input schema / properties / forward_message_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Forward Message Id" +} - added
Input schema / properties / is_markdownAdded value: +{ + "default": false, + "title": "Is Markdown", + "type": "boolean" +} - added
Input schema / properties / reply_allAdded value: +{ + "default": false, + "title": "Reply All", + "type": "boolean" +} - added
Input schema / properties / reply_to_message_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Reply To Message Id" +} - added
Input schema / properties / subject / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / subject / defaultAdded value: +null - removed
Input schema / properties / subject / typeRemoved value: -"string" - added
Input schema / properties / to / anyOfAdded value: +[ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / to / defaultAdded value: +null - removed
Input schema / properties / to / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / to / typeRemoved value: -"array" - changed
Input schema / requiredPrevious value: -[ - "to", - "subject", - "body" -]New value: +[ + "body" +]
- Changed
outlook_create_event1 field changed- added
Input schema / properties / keyAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Key" +}
- Changed
outlook_download_attachment5 fields changed- added
Input schema / properties / as_contentAdded value: +{ + "default": false, + "title": "As Content", + "type": "boolean" +} - added
Input schema / properties / save_path / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / save_path / defaultAdded value: +null - removed
Input schema / properties / save_path / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "message_id", - "attachment_id", - "save_path" -]New value: +[ + "message_id", + "attachment_id" +]
- Changed
outlook_download_task_attachment5 fields changed- added
Input schema / properties / as_contentAdded value: +{ + "default": false, + "title": "As Content", + "type": "boolean" +} - added
Input schema / properties / save_path / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / save_path / defaultAdded value: +null - removed
Input schema / properties / save_path / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "task_id", - "attachment_id", - "save_path" -]New value: +[ + "task_id", + "attachment_id" +]
- Added
outlook_find_event_by_key - Changed
outlook_forward1 field changed- added
Input schema / properties / is_markdownAdded value: +{ + "default": false, + "title": "Is Markdown", + "type": "boolean" +}
- Changed
outlook_read_message1 field changed- added
Input schema / properties / include_sender_authAdded value: +{ + "default": false, + "title": "Include Sender Auth", + "type": "boolean" +}
- Changed
outlook_read_messages1 field changed- added
Input schema / properties / include_sender_authAdded value: +{ + "default": false, + "title": "Include Sender Auth", + "type": "boolean" +}
- Added
outlook_remove_event_attachment - Changed
outlook_reply1 field changed- added
Input schema / properties / is_markdownAdded value: +{ + "default": false, + "title": "Is Markdown", + "type": "boolean" +}
- Changed
outlook_search_contacts5 fields changed- added
Input schema / properties / phoneAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Phone" +} - added
Input schema / properties / query / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / query / defaultAdded value: +null - removed
Input schema / properties / query / typeRemoved value: -"string" - removed
Input schema / requiredRemoved value: -[ - "query" -]
- Changed
outlook_send_message1 field changed- added
Input schema / properties / is_markdownAdded value: +{ + "default": false, + "title": "Is Markdown", + "type": "boolean" +}
- Changed
outlook_send_with_attachments6 fields changed- added
Input schema / properties / attachment_paths / anyOfAdded value: +[ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / attachment_paths / defaultAdded value: +null - removed
Input schema / properties / attachment_paths / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / attachment_paths / typeRemoved value: -"array" - added
Input schema / properties / attachmentsAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Attachments" +} - changed
Input schema / requiredPrevious value: -[ - "to", - "subject", - "body", - "attachment_paths" -]New value: +[ + "to", + "subject", + "body" +]
- Changed
outlook_update_contact2 fields changed- added
Input schema / properties / add_emailsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Add Emails" +} - added
Input schema / properties / remove_emailsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Remove Emails" +}
- Changed
outlook_update_draft1 field changed- added
Input schema / properties / is_markdownAdded value: +{ + "default": false, + "title": "Is Markdown", + "type": "boolean" +}
- Changed
outlook_update_event1 field changed- added
Input schema / properties / keyAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Key" +}
3 tool updates
v1.26.0- Changed
outlook_create_contact6 fields changed- added
Input schema / properties / birthdayAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Birthday" +} - added
Input schema / properties / categoriesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Categories" +} - added
Input schema / properties / job_titleAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Job Title" +} - added
Input schema / properties / middle_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Middle Name" +} - added
Input schema / properties / personal_notesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Personal Notes" +} - added
Input schema / properties / phone_typeAdded value: +{ + "default": "mobile", + "title": "Phone Type", + "type": "string" +}
- Changed
outlook_create_event1 field changed- added
Input schema / properties / calendarAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Calendar" +}
- Changed
outlook_update_contact9 fields changed- added
Input schema / properties / birthdayAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Birthday" +} - added
Input schema / properties / categoriesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Categories" +} - added
Input schema / properties / clear_phonesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Clear Phones" +} - added
Input schema / properties / companyAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Company" +} - added
Input schema / properties / job_titleAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Job Title" +} - added
Input schema / properties / middle_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Middle Name" +} - added
Input schema / properties / personal_notesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Personal Notes" +} - added
Input schema / properties / phone_typeAdded value: +{ + "default": "mobile", + "title": "Phone Type", + "type": "string" +} - added
Input schema / properties / titleAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Title" +}
1 tool update
v1.23.0- Changed
outlook_update_event1 field changed- added
Input schema / properties / timezoneAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Timezone" +}
14 tool updates
v1.22.1- Added
outlook_add_checklist_item - Changed
outlook_create_event2 fields changed- added
Input schema / properties / show_asAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Show As" +} - added
Input schema / properties / timezoneAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Timezone" +}
- Added
outlook_delete_checklist_item - Added
outlook_delete_task_attachment - Added
outlook_download_task_attachment - Added
outlook_get_task - Removed
outlook_list_accounts - Changed
outlook_list_events1 field changed- added
Input schema / properties / calendarAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Calendar" +}
- Added
outlook_list_task_attachments - Removed
outlook_switch_account - Added
outlook_update_checklist_item - Changed
outlook_update_contact3 fields changed- added
Input schema / properties / business_addressAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Business Address" +} - added
Input schema / properties / home_addressAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Home Address" +} - added
Input schema / properties / other_addressAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Other Address" +}
- Changed
outlook_update_event1 field changed- added
Input schema / properties / show_asAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Show As" +}
- Added
outlook_upload_task_attachment
3 tool updates
v1.19.0- Changed
outlook_create_event1 field changed- changed
Input schema / properties / recurrence / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "string" + }, + { + "type": "null" + } +]
- Changed
outlook_send_message1 field changed- removed
Input schema / properties / sensitivityRemoved value: -{ - "default": "normal", - "title": "Sensitivity", - "type": "string" -}
- Changed
outlook_update_event4 fields changed- added
Input schema / properties / attendeesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Attendees" +} - added
Input schema / properties / is_all_dayAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Is All Day" +} - added
Input schema / properties / recurrenceAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Recurrence" +} - added
Input schema / properties / remove_recurrenceAdded value: +{ + "default": false, + "title": "Remove Recurrence", + "type": "boolean" +}
19 tool updates
v1.14.0- Added
outlook_auth_status - Added
outlook_categorize_message - Added
outlook_complete_task - Added
outlook_delete_message - Added
outlook_delete_task - Added
outlook_flag_message - Added
outlook_forward - Added
outlook_list_drafts - Added
outlook_list_inbox - Added
outlook_list_inbox_delta - Added
outlook_list_inbox_overrides - Added
outlook_mark_read - Added
outlook_move_message - Added
outlook_read_messages - Added
outlook_reclassify_message - Added
outlook_reply - Added
outlook_search_mail - Added
outlook_send_message - Added
outlook_set_inbox_override
19 tool updates
v1.12.0- Removed
outlook_auth_status - Removed
outlook_categorize_message - Removed
outlook_complete_task - Removed
outlook_delete_message - Removed
outlook_delete_task - Removed
outlook_flag_message - Removed
outlook_forward - Removed
outlook_list_drafts - Removed
outlook_list_inbox - Removed
outlook_list_inbox_delta - Removed
outlook_list_inbox_overrides - Removed
outlook_mark_read - Removed
outlook_move_message - Removed
outlook_read_messages - Removed
outlook_reclassify_message - Removed
outlook_reply - Removed
outlook_search_mail - Removed
outlook_send_message - Removed
outlook_set_inbox_override
62 tool updates
v1.11.0- First observed
outlook_attach_to_draft - First observed
outlook_auth_status - First observed
outlook_batch_triage - First observed
outlook_categorize_message - First observed
outlook_changes_since - First observed
outlook_complete_task - First observed
outlook_copy_message - First observed
outlook_create_contact - First observed
outlook_create_draft - First observed
outlook_create_event - First observed
outlook_create_folder - First observed
outlook_create_task - First observed
outlook_delete_contact - First observed
outlook_delete_draft - First observed
outlook_delete_event - First observed
outlook_delete_folder - First observed
outlook_delete_inbox_override - First observed
outlook_delete_message - First observed
outlook_delete_task - First observed
outlook_download_attachment - First observed
outlook_flag_message - First observed
outlook_forward - First observed
outlook_get_contact - First observed
outlook_get_event - First observed
outlook_get_mail_tips - First observed
outlook_list_accounts - First observed
outlook_list_attachments - First observed
outlook_list_calendars - First observed
outlook_list_categories - First observed
outlook_list_contacts - First observed
outlook_list_contacts_delta - First observed
outlook_list_drafts - First observed
outlook_list_events - First observed
outlook_list_events_delta - First observed
outlook_list_folders - First observed
outlook_list_inbox - First observed
outlook_list_inbox_delta - First observed
outlook_list_inbox_overrides - First observed
outlook_list_task_lists - First observed
outlook_list_tasks - First observed
outlook_list_thread - First observed
outlook_mark_read - First observed
outlook_move_message - First observed
outlook_read_message - First observed
outlook_read_messages - First observed
outlook_reclassify_message - First observed
outlook_remove_draft_attachment - First observed
outlook_rename_folder - First observed
outlook_reply - First observed
outlook_rsvp - First observed
outlook_search_contacts - First observed
outlook_search_mail - First observed
outlook_send_draft - First observed
outlook_send_message - First observed
outlook_send_with_attachments - First observed
outlook_set_inbox_override - First observed
outlook_switch_account - First observed
outlook_update_contact - First observed
outlook_update_draft - First observed
outlook_update_event - First observed
outlook_update_task - First observed
outlook_whoami
TDQS
Scored across 71 tools
Descriptions actively differentiate near-pairs (list_inbox vs search_mail, list vs *_delta, reclassify_message vs set_inbox_override, reply vs rsvp, move vs copy vs delete, read_message vs read_messages), which is unusually good given the surface size. Remaining confusion risk comes from the volume of similarly shaped attachment/draft/event tools and the singular/plural read pair, but boundaries are stated explicitly.
Every tool uses the same outlook_ prefix and snake_case verb_noun form (list_, get_, create_, update_, delete_, send_, remove_). Resource qualifiers (task_attachment, event_attachment, draft) consistently keep parallel tools distinguishable without breaking the pattern.
At 71 tools the surface is far beyond a tractable set for an agent to select from reliably, even though the underlying domain (mail, calendar, contacts, To Do, attachments) is genuinely broad. Many capabilities (drafts, folders, overrides, checklist items, attachments across four resource types, three delta tools plus a combined digest) are niche enough that they inflate the menu rather than each earning a slot.
Lifecycle coverage is thorough: full CRUD on messages, drafts, folders, events, contacts, tasks and attachments, plus send/reply/forward, RSVP, categorization, flagging, focused-inbox overrides, bulk read/triage, and delta/polling sync. No obvious dead ends for the stated mail/calendar/contacts/tasks purpose.
Maintenance
Related MCP Connectors
A MCP server that works with Outlook Calendar to manage event listing, reading, and updates.
A MCP server for Outlook email that lets you search, read, and draft emails and replies.
Hosted MCP server for your Gmail, Outlook and IMAP mail, with mailboxes and scopes set per agent.
MCP server for Nylas — read email, calendars, events and contacts, and send email or create events.
Related MCP Servers
- AlicenseAqualityCmaintenance22 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.22504 npm39MIT
- AlicenseNot gradedqualityCmaintenanceComprehensive MCP server for local Microsoft Outlook automation, providing 64 tools across email, calendar, contacts, tasks, notes, and Exchange features on both Windows and macOS.28 PyPI1MIT
- AlicenseAqualityFmaintenanceAn MCP server that provides 49 tools to access Microsoft Outlook for Mac, enabling management of mail, calendar, contacts, tasks, and notes via AppleScript.4910MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for sending and managing Microsoft Outlook email via the Microsoft Graph API, including drafts, replies, contacts, and directory search.173 npmMIT