← outlook-mcp

outlook-mcp 1.14.0

pypi · outlook-graph-mcp · current release

62
Tools
0
Resources
0
Templates
0
Prompts

Observation

Observed 2026-09-04T22:49:59.576Z using mcpSecurity-inventory. Status: succeeded. Negotiated protocol: 2025-06-18.

Server capabilities
{
  "experimental": {},
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "listChanged": false,
    "subscribe": false
  },
  "tools": {
    "listChanged": false
  }
}

Tools 62

ToolCategoryAnnotationsRisk
outlook_attach_to_draftAdd attachments to an existing draft; auto-switches to upload-session for files >3MB. `attachment_paths` must be absolute paths to files that exist on the host. Returns new attachment IDs for later removal via outlook_remove_draft_attachment.
Input schema
{
  "properties": {
    "draft_id": {
      "title": "Draft Id",
      "type": "string"
    },
    "attachment_paths": {
      "items": {
        "type": "string"
      },
      "title": "Attachment Paths",
      "type": "array"
    }
  },
  "required": [
    "draft_id",
    "attachment_paths"
  ],
  "type": "object",
  "title": "outlook_attach_to_draftArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_auth_statusCheck authentication status. Run `outlook-mcp auth` on the host if needed.
Input schema
{
  "properties": {},
  "type": "object",
  "title": "outlook_auth_statusArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_batch_triageTriage 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.
Input schema
{
  "properties": {
    "message_ids": {
      "items": {
        "type": "string"
      },
      "title": "Message Ids",
      "type": "array"
    },
    "action": {
      "title": "Action",
      "type": "string"
    },
    "value": {
      "title": "Value",
      "type": "string"
    }
  },
  "required": [
    "message_ids",
    "action",
    "value"
  ],
  "type": "object",
  "title": "outlook_batch_triageArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_categorize_messageSet categories on a message (replaces the full list). Example: outlook_categorize_message(message_id=..., categories=["Follow-up", "Pricing"])
Input schema
{
  "properties": {
    "message_id": {
      "title": "Message Id",
      "type": "string"
    },
    "categories": {
      "items": {
        "type": "string"
      },
      "title": "Categories",
      "type": "array"
    }
  },
  "required": [
    "message_id",
    "categories"
  ],
  "type": "object",
  "title": "outlook_categorize_messageArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_changes_sinceOne 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 returns a snapshot filtered to the last `fallback_window_hours` (default 24) so the digest doesn't surface thousands of historical items; subsequent calls (tokens passed back) return only what changed. Each resource's token is independent — drop one stale token without re-syncing the others. If Graph 410s on a token (`syncStateNotFound`), that resource auto-resyncs and `_meta.resync` lists which one. `urgent_flagged` = high-importance OR flagged mail. `by_sender` = top 5 senders. Calendar `modified[]` is reserved for future use — modified events surface in `new[]` today (Graph delta doesn't distinguish them). Calendar `organizer_email` is also currently empty (the v1.9.0 delta formatter surfaces the organizer name only).
Input schema
{
  "properties": {
    "delta_tokens": {
      "anyOf": [
        {
          "additionalProperties": true,
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Delta Tokens"
    },
    "fallback_window_hours": {
      "default": 24,
      "title": "Fallback Window Hours",
      "type": "integer"
    }
  },
  "type": "object",
  "title": "outlook_changes_sinceArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_complete_taskMark a To Do task as completed.
Input schema
{
  "properties": {
    "task_id": {
      "title": "Task Id",
      "type": "string"
    },
    "list_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "List Id"
    }
  },
  "required": [
    "task_id"
  ],
  "type": "object",
  "title": "outlook_complete_taskArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_copy_messageCopy 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.
Input schema
{
  "properties": {
    "message_id": {
      "title": "Message Id",
      "type": "string"
    },
    "folder": {
      "title": "Folder",
      "type": "string"
    }
  },
  "required": [
    "message_id",
    "folder"
  ],
  "type": "object",
  "title": "outlook_copy_messageArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_create_contactCreate a new contact with name and optional email, phone, company, title.
Input schema
{
  "properties": {
    "first_name": {
      "title": "First Name",
      "type": "string"
    },
    "last_name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Last Name"
    },
    "email": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Email"
    },
    "phone": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Phone"
    },
    "company": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Company"
    },
    "title": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Title"
    }
  },
  "required": [
    "first_name"
  ],
  "type": "object",
  "title": "outlook_create_contactArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_create_draftCreate a draft email for later review/send (pair with outlook_send_draft). Use this when a human should review before sending; use outlook_send_message to send immediately without review. Pass deferred_send_datetime (ISO 8601, e.g. "2026-05-06T08:00:00Z") to schedule delayed delivery — Exchange holds the message server-side after outlook_send_draft. Pass reply_to to pre-populate the Reply-To header.
Input schema
{
  "properties": {
    "to": {
      "items": {
        "type": "string"
      },
      "title": "To",
      "type": "array"
    },
    "subject": {
      "title": "Subject",
      "type": "string"
    },
    "body": {
      "title": "Body",
      "type": "string"
    },
    "cc": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Cc"
    },
    "bcc": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Bcc"
    },
    "is_html": {
      "default": false,
      "title": "Is Html",
      "type": "boolean"
    },
    "importance": {
      "default": "normal",
      "title": "Importance",
      "type": "string"
    },
    "reply_to": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Reply To"
    },
    "deferred_send_datetime": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Deferred Send Datetime"
    }
  },
  "required": [
    "to",
    "subject",
    "body"
  ],
  "type": "object",
  "title": "outlook_create_draftArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_create_eventCreate a calendar event with optional attendees, recurrence, and Teams 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=True) `start`/`end` are ISO 8601. `recurrence` accepts a simple string ("daily", "weekly", "monthly").
Input schema
{
  "properties": {
    "subject": {
      "title": "Subject",
      "type": "string"
    },
    "start": {
      "title": "Start",
      "type": "string"
    },
    "end": {
      "title": "End",
      "type": "string"
    },
    "location": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Location"
    },
    "body": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Body"
    },
    "attendees": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Attendees"
    },
    "is_all_day": {
      "default": false,
      "title": "Is All Day",
      "type": "boolean"
    },
    "is_online": {
      "default": false,
      "title": "Is Online",
      "type": "boolean"
    },
    "recurrence": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Recurrence"
    }
  },
  "required": [
    "subject",
    "start",
    "end"
  ],
  "type": "object",
  "title": "outlook_create_eventArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_create_folderCreate a mail folder; pass `parent_folder` (name or ID) to nest under an existing folder.
Input schema
{
  "properties": {
    "name": {
      "title": "Name",
      "type": "string"
    },
    "parent_folder": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Parent Folder"
    }
  },
  "required": [
    "name"
  ],
  "type": "object",
  "title": "outlook_create_folderArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_create_taskCreate 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") `due` is ISO 8601. `importance` is "low", "normal", or "high". Defaults to the user's default list when `list_id` is omitted.
Input schema
{
  "properties": {
    "title": {
      "title": "Title",
      "type": "string"
    },
    "list_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "List Id"
    },
    "due": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Due"
    },
    "importance": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Importance"
    },
    "body": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Body"
    },
    "reminder": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Reminder"
    },
    "recurrence": {
      "anyOf": [
        {
          "additionalProperties": true,
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Recurrence"
    }
  },
  "required": [
    "title"
  ],
  "type": "object",
  "title": "outlook_create_taskArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_delete_contactDelete a contact by ID.
Input schema
{
  "properties": {
    "contact_id": {
      "title": "Contact Id",
      "type": "string"
    }
  },
  "required": [
    "contact_id"
  ],
  "type": "object",
  "title": "outlook_delete_contactArguments"
}
Annotations
{
  "destructiveHint": true,
  "readOnlyHint": false
}
Writes · Destructive
outlook_delete_draftDelete a draft message by ID.
Input schema
{
  "properties": {
    "draft_id": {
      "title": "Draft Id",
      "type": "string"
    }
  },
  "required": [
    "draft_id"
  ],
  "type": "object",
  "title": "outlook_delete_draftArguments"
}
Annotations
{
  "destructiveHint": true,
  "readOnlyHint": false
}
Writes · Destructive
outlook_delete_eventDelete a calendar event by ID (cancels and notifies attendees if you're the organizer).
Input schema
{
  "properties": {
    "event_id": {
      "title": "Event Id",
      "type": "string"
    }
  },
  "required": [
    "event_id"
  ],
  "type": "object",
  "title": "outlook_delete_eventArguments"
}
Annotations
{
  "destructiveHint": true,
  "readOnlyHint": false
}
Writes · Destructive
outlook_delete_folderDelete a user-created mail folder by ID; refuses well-known folders (inbox, sentitems).
Input schema
{
  "properties": {
    "folder_id": {
      "title": "Folder Id",
      "type": "string"
    }
  },
  "required": [
    "folder_id"
  ],
  "type": "object",
  "title": "outlook_delete_folderArguments"
}
Annotations
{
  "destructiveHint": true,
  "readOnlyHint": false
}
Writes · Destructive
outlook_delete_inbox_overrideDelete a Focused Inbox per-sender override rule by its ID.
Input schema
{
  "properties": {
    "override_id": {
      "title": "Override Id",
      "type": "string"
    }
  },
  "required": [
    "override_id"
  ],
  "type": "object",
  "title": "outlook_delete_inbox_overrideArguments"
}
Annotations
{
  "destructiveHint": true,
  "readOnlyHint": false
}
Writes · Destructive
outlook_delete_messageDelete 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.
Input schema
{
  "properties": {
    "message_id": {
      "title": "Message Id",
      "type": "string"
    },
    "permanent": {
      "default": false,
      "title": "Permanent",
      "type": "boolean"
    }
  },
  "required": [
    "message_id"
  ],
  "type": "object",
  "title": "outlook_delete_messageArguments"
}
Annotations
{
  "destructiveHint": true,
  "readOnlyHint": false
}
Writes · Destructive
outlook_delete_taskDelete a task from a Microsoft To Do list.
Input schema
{
  "properties": {
    "task_id": {
      "title": "Task Id",
      "type": "string"
    },
    "list_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "List Id"
    }
  },
  "required": [
    "task_id"
  ],
  "type": "object",
  "title": "outlook_delete_taskArguments"
}
Annotations
{
  "destructiveHint": true,
  "readOnlyHint": false
}
Writes · Destructive
outlook_download_attachmentDownload an attachment from a message and write decoded bytes to `save_path` on the host.
Input schema
{
  "properties": {
    "message_id": {
      "title": "Message Id",
      "type": "string"
    },
    "attachment_id": {
      "title": "Attachment Id",
      "type": "string"
    },
    "save_path": {
      "title": "Save Path",
      "type": "string"
    }
  },
  "required": [
    "message_id",
    "attachment_id",
    "save_path"
  ],
  "type": "object",
  "title": "outlook_download_attachmentArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_flag_messageSet the follow-up flag on a message. `status` is "flagged", "complete", or "notFlagged".
Input schema
{
  "properties": {
    "message_id": {
      "title": "Message Id",
      "type": "string"
    },
    "status": {
      "title": "Status",
      "type": "string"
    }
  },
  "required": [
    "message_id",
    "status"
  ],
  "type": "object",
  "title": "outlook_flag_messageArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_forwardForward an existing message to new recipients, with optional comment.
Input schema
{
  "properties": {
    "message_id": {
      "title": "Message Id",
      "type": "string"
    },
    "to": {
      "items": {
        "type": "string"
      },
      "title": "To",
      "type": "array"
    },
    "comment": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Comment"
    }
  },
  "required": [
    "message_id",
    "to"
  ],
  "type": "object",
  "title": "outlook_forwardArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_get_contactGet one full contact by ID.
Input schema
{
  "properties": {
    "contact_id": {
      "title": "Contact Id",
      "type": "string"
    }
  },
  "required": [
    "contact_id"
  ],
  "type": "object",
  "title": "outlook_get_contactArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_get_eventGet one full calendar event by ID, including body, attendees, organizer, and recurrence.
Input schema
{
  "properties": {
    "event_id": {
      "title": "Event Id",
      "type": "string"
    }
  },
  "required": [
    "event_id"
  ],
  "type": "object",
  "title": "outlook_get_eventArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_get_mail_tipsPre-send check for recipients: out-of-office, delivery limits, mailbox-full warnings.
Input schema
{
  "properties": {
    "emails": {
      "items": {
        "type": "string"
      },
      "title": "Emails",
      "type": "array"
    }
  },
  "required": [
    "emails"
  ],
  "type": "object",
  "title": "outlook_get_mail_tipsArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_list_accountsList all configured Outlook accounts and their authentication status.
Input schema
{
  "properties": {},
  "type": "object",
  "title": "outlook_list_accountsArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_list_attachmentsList attachments on a message — returns IDs, names, sizes, and content types.
Input schema
{
  "properties": {
    "message_id": {
      "title": "Message Id",
      "type": "string"
    }
  },
  "required": [
    "message_id"
  ],
  "type": "object",
  "title": "outlook_list_attachmentsArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_list_calendarsList all calendars available to the authenticated user (primary + secondary).
Input schema
{
  "properties": {},
  "type": "object",
  "title": "outlook_list_calendarsArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_list_categoriesList the user's master category definitions (names + colors). Provides the valid values for outlook_categorize_message.
Input schema
{
  "properties": {},
  "type": "object",
  "title": "outlook_list_categoriesArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_list_contactsList contacts with cursor pagination. Use for one-shot queries; use outlook_list_contacts_delta for polling/recurring agents.
Input schema
{
  "properties": {
    "count": {
      "default": 25,
      "title": "Count",
      "type": "integer"
    },
    "cursor": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Cursor"
    }
  },
  "type": "object",
  "title": "outlook_list_contactsArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_list_contacts_deltaList 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=<token from prior response>). is_deleted=True items are tombstones (drop cached payload). has_more=True means drain immediately by passing the returned delta_token back.
Input schema
{
  "properties": {
    "page_size": {
      "default": 50,
      "title": "Page Size",
      "type": "integer"
    },
    "delta_token": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Delta Token"
    }
  },
  "type": "object",
  "title": "outlook_list_contacts_deltaArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_list_draftsList messages in the Drafts folder with cursor pagination.
Input schema
{
  "properties": {
    "count": {
      "default": 25,
      "title": "Count",
      "type": "integer"
    },
    "cursor": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Cursor"
    }
  },
  "type": "object",
  "title": "outlook_list_draftsArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_list_eventsList 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 to drop large fields (body, attendees, organizer, categories) — ~10x fewer tokens for day-at-a-glance scans.
Input schema
{
  "properties": {
    "days": {
      "default": 7,
      "title": "Days",
      "type": "integer"
    },
    "after": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "After"
    },
    "before": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Before"
    },
    "count": {
      "default": 50,
      "title": "Count",
      "type": "integer"
    },
    "cursor": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Cursor"
    },
    "concise": {
      "default": false,
      "title": "Concise",
      "type": "boolean"
    }
  },
  "type": "object",
  "title": "outlook_list_eventsArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_list_events_deltaList 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=<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.
Input schema
{
  "properties": {
    "start": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Start"
    },
    "end": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "End"
    },
    "page_size": {
      "default": 50,
      "title": "Page Size",
      "type": "integer"
    },
    "delta_token": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Delta Token"
    }
  },
  "type": "object",
  "title": "outlook_list_events_deltaArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_list_foldersList mail folders with message counts, parent_id, and child count. Default is top-level only; pass recursive=True to walk the full tree and resolve subfolder names.
Input schema
{
  "properties": {
    "cursor": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Cursor"
    },
    "recursive": {
      "default": false,
      "title": "Recursive",
      "type": "boolean"
    }
  },
  "type": "object",
  "title": "outlook_list_foldersArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_list_inboxList 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.
Input schema
{
  "properties": {
    "folder": {
      "default": "inbox",
      "title": "Folder",
      "type": "string"
    },
    "count": {
      "default": 25,
      "title": "Count",
      "type": "integer"
    },
    "unread_only": {
      "default": false,
      "title": "Unread Only",
      "type": "boolean"
    },
    "from_address": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "From Address"
    },
    "after": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "After"
    },
    "before": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Before"
    },
    "skip": {
      "default": 0,
      "title": "Skip",
      "type": "integer"
    },
    "cursor": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Cursor"
    },
    "classification": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Classification"
    },
    "concise": {
      "default": false,
      "title": "Concise",
      "type": "boolean"
    },
    "uncategorized_only": {
      "default": false,
      "title": "Uncategorized Only",
      "type": "boolean"
    }
  },
  "type": "object",
  "title": "outlook_list_inboxArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_list_inbox_deltaList 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=<token from prior response>). is_deleted=True items are tombstones (drop cached payload). has_more=True means drain immediately by passing the returned delta_token back.
Input schema
{
  "properties": {
    "folder": {
      "default": "inbox",
      "title": "Folder",
      "type": "string"
    },
    "page_size": {
      "default": 50,
      "title": "Page Size",
      "type": "integer"
    },
    "delta_token": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Delta Token"
    }
  },
  "type": "object",
  "title": "outlook_list_inbox_deltaArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_list_inbox_overridesList 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.
Input schema
{
  "properties": {},
  "type": "object",
  "title": "outlook_list_inbox_overridesArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_list_task_listsList all Microsoft To Do task lists for the current user.
Input schema
{
  "properties": {},
  "type": "object",
  "title": "outlook_list_task_listsArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_list_tasksList tasks in a To Do list with optional `status` filter. `status`: "notStarted", "inProgress", or "completed".
Input schema
{
  "properties": {
    "list_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "List Id"
    },
    "status": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Status"
    },
    "count": {
      "default": 25,
      "title": "Count",
      "type": "integer"
    },
    "cursor": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Cursor"
    }
  },
  "type": "object",
  "title": "outlook_list_tasksArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_list_threadList 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.
Input schema
{
  "properties": {
    "conversation_id": {
      "title": "Conversation Id",
      "type": "string"
    },
    "count": {
      "default": 50,
      "title": "Count",
      "type": "integer"
    },
    "concise": {
      "default": false,
      "title": "Concise",
      "type": "boolean"
    }
  },
  "required": [
    "conversation_id"
  ],
  "type": "object",
  "title": "outlook_list_threadArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_mark_readMark a single message as read or unread (set is_read=True or False).
Input schema
{
  "properties": {
    "message_id": {
      "title": "Message Id",
      "type": "string"
    },
    "is_read": {
      "title": "Is Read",
      "type": "boolean"
    }
  },
  "required": [
    "message_id",
    "is_read"
  ],
  "type": "object",
  "title": "outlook_mark_readArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_move_messageMove 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.
Input schema
{
  "properties": {
    "message_id": {
      "title": "Message Id",
      "type": "string"
    },
    "folder": {
      "title": "Folder",
      "type": "string"
    }
  },
  "required": [
    "message_id",
    "folder"
  ],
  "type": "object",
  "title": "outlook_move_messageArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_read_messageGet one full message by ID. `format` is "text", "html", or "full" (both). Pass include_deferred_send=True to also return the scheduled-send time (PR_DEFERRED_SEND_TIME) as deferred_send_datetime — useful when recreating a delayed draft. Pass concise=True to drop large fields (body, body_html) and return a 200-char body_preview — ~10x fewer tokens for triage scans.
Input schema
{
  "properties": {
    "message_id": {
      "title": "Message Id",
      "type": "string"
    },
    "format": {
      "default": "text",
      "title": "Format",
      "type": "string"
    },
    "include_deferred_send": {
      "default": false,
      "title": "Include Deferred Send",
      "type": "boolean"
    },
    "concise": {
      "default": false,
      "title": "Concise",
      "type": "boolean"
    }
  },
  "required": [
    "message_id"
  ],
  "type": "object",
  "title": "outlook_read_messageArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_read_messagesBulk read up to 20 messages by ID via $batch — use NOT N outlook_read_message calls. Per-message shape in `messages` matches outlook_read_message byte-for-byte for the same (format, concise, include_deferred_send). Ordering follows input `message_ids`. Returns `{messages, failures, requested, succeeded, failed}` — 404s on some IDs are surfaced in `failures` without failing the whole call (partial-failure tolerant). Example: outlook_read_messages(message_ids=[id1, id2, id3], concise=True) Hard cap of 20 (Graph $batch limit).
Input schema
{
  "properties": {
    "message_ids": {
      "items": {
        "type": "string"
      },
      "title": "Message Ids",
      "type": "array"
    },
    "format": {
      "default": "text",
      "title": "Format",
      "type": "string"
    },
    "concise": {
      "default": false,
      "title": "Concise",
      "type": "boolean"
    },
    "include_deferred_send": {
      "default": false,
      "title": "Include Deferred Send",
      "type": "boolean"
    }
  },
  "required": [
    "message_ids"
  ],
  "type": "object",
  "title": "outlook_read_messagesArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_reclassify_messageReclassify 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.
Input schema
{
  "properties": {
    "message_id": {
      "title": "Message Id",
      "type": "string"
    },
    "classification": {
      "title": "Classification",
      "type": "string"
    }
  },
  "required": [
    "message_id",
    "classification"
  ],
  "type": "object",
  "title": "outlook_reclassify_messageArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_remove_draft_attachmentRemove a single attachment from a draft message by attachment ID.
Input schema
{
  "properties": {
    "draft_id": {
      "title": "Draft Id",
      "type": "string"
    },
    "attachment_id": {
      "title": "Attachment Id",
      "type": "string"
    }
  },
  "required": [
    "draft_id",
    "attachment_id"
  ],
  "type": "object",
  "title": "outlook_remove_draft_attachmentArguments"
}
Annotations
{
  "destructiveHint": true,
  "readOnlyHint": false
}
Writes · Destructive
outlook_rename_folderRename a user-created mail folder by ID.
Input schema
{
  "properties": {
    "folder_id": {
      "title": "Folder Id",
      "type": "string"
    },
    "name": {
      "title": "Name",
      "type": "string"
    }
  },
  "required": [
    "folder_id",
    "name"
  ],
  "type": "object",
  "title": "outlook_rename_folderArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_replyReply (or reply-all) to an email message. Use this for email; use outlook_rsvp for calendar meeting invites.
Input schema
{
  "properties": {
    "message_id": {
      "title": "Message Id",
      "type": "string"
    },
    "body": {
      "title": "Body",
      "type": "string"
    },
    "reply_all": {
      "default": false,
      "title": "Reply All",
      "type": "boolean"
    },
    "is_html": {
      "default": false,
      "title": "Is Html",
      "type": "boolean"
    }
  },
  "required": [
    "message_id",
    "body"
  ],
  "type": "object",
  "title": "outlook_replyArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_rsvpRSVP 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.
Input schema
{
  "properties": {
    "event_id": {
      "title": "Event Id",
      "type": "string"
    },
    "response": {
      "title": "Response",
      "type": "string"
    },
    "message": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Message"
    }
  },
  "required": [
    "event_id",
    "response"
  ],
  "type": "object",
  "title": "outlook_rsvpArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_search_contactsSearch contacts by name or email using KQL query syntax.
Input schema
{
  "properties": {
    "query": {
      "title": "Query",
      "type": "string"
    },
    "count": {
      "default": 25,
      "title": "Count",
      "type": "integer"
    }
  },
  "required": [
    "query"
  ],
  "type": "object",
  "title": "outlook_search_contactsArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_search_mailFull-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.
Input schema
{
  "properties": {
    "query": {
      "title": "Query",
      "type": "string"
    },
    "count": {
      "default": 25,
      "title": "Count",
      "type": "integer"
    },
    "folder": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Folder"
    },
    "cursor": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Cursor"
    },
    "concise": {
      "default": false,
      "title": "Concise",
      "type": "boolean"
    }
  },
  "required": [
    "query"
  ],
  "type": "object",
  "title": "outlook_search_mailArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —
outlook_send_draftSend an existing draft (pair with outlook_create_draft for human-review send flow).
Input schema
{
  "properties": {
    "draft_id": {
      "title": "Draft Id",
      "type": "string"
    }
  },
  "required": [
    "draft_id"
  ],
  "type": "object",
  "title": "outlook_send_draftArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_send_messageSend 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).
Input schema
{
  "properties": {
    "to": {
      "items": {
        "type": "string"
      },
      "title": "To",
      "type": "array"
    },
    "subject": {
      "title": "Subject",
      "type": "string"
    },
    "body": {
      "title": "Body",
      "type": "string"
    },
    "cc": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Cc"
    },
    "bcc": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Bcc"
    },
    "is_html": {
      "default": false,
      "title": "Is Html",
      "type": "boolean"
    },
    "importance": {
      "default": "normal",
      "title": "Importance",
      "type": "string"
    },
    "sensitivity": {
      "default": "normal",
      "title": "Sensitivity",
      "type": "string"
    },
    "request_read_receipt": {
      "default": false,
      "title": "Request Read Receipt",
      "type": "boolean"
    },
    "reply_to": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Reply To"
    }
  },
  "required": [
    "to",
    "subject",
    "body"
  ],
  "type": "object",
  "title": "outlook_send_messageArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_send_with_attachmentsSend an email with file attachments; auto-switches to upload-session for files >3MB. `attachment_paths` must be absolute paths to files that exist on the host. Pass reply_to to route replies to a different address.
Input schema
{
  "properties": {
    "to": {
      "items": {
        "type": "string"
      },
      "title": "To",
      "type": "array"
    },
    "subject": {
      "title": "Subject",
      "type": "string"
    },
    "body": {
      "title": "Body",
      "type": "string"
    },
    "attachment_paths": {
      "items": {
        "type": "string"
      },
      "title": "Attachment Paths",
      "type": "array"
    },
    "cc": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Cc"
    },
    "bcc": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Bcc"
    },
    "is_html": {
      "default": false,
      "title": "Is Html",
      "type": "boolean"
    },
    "importance": {
      "default": "normal",
      "title": "Importance",
      "type": "string"
    },
    "reply_to": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Reply To"
    }
  },
  "required": [
    "to",
    "subject",
    "body",
    "attachment_paths"
  ],
  "type": "object",
  "title": "outlook_send_with_attachmentsArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_set_inbox_overrideCreate 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".
Input schema
{
  "properties": {
    "sender_email": {
      "title": "Sender Email",
      "type": "string"
    },
    "classify_as": {
      "title": "Classify As",
      "type": "string"
    }
  },
  "required": [
    "sender_email",
    "classify_as"
  ],
  "type": "object",
  "title": "outlook_set_inbox_overrideArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_switch_accountSwitch the active Outlook account by configured `name` (from outlook_list_accounts).
Input schema
{
  "properties": {
    "name": {
      "title": "Name",
      "type": "string"
    }
  },
  "required": [
    "name"
  ],
  "type": "object",
  "title": "outlook_switch_accountArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_update_contactUpdate an existing contact (partial patch — only provided fields change).
Input schema
{
  "properties": {
    "contact_id": {
      "title": "Contact Id",
      "type": "string"
    },
    "first_name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "First Name"
    },
    "last_name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Last Name"
    },
    "email": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Email"
    },
    "phone": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Phone"
    }
  },
  "required": [
    "contact_id"
  ],
  "type": "object",
  "title": "outlook_update_contactArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_update_draftUpdate 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.
Input schema
{
  "properties": {
    "draft_id": {
      "title": "Draft Id",
      "type": "string"
    },
    "subject": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Subject"
    },
    "body": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Body"
    },
    "to": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "To"
    },
    "cc": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Cc"
    },
    "reply_to": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Reply To"
    },
    "is_html": {
      "default": false,
      "title": "Is Html",
      "type": "boolean"
    },
    "deferred_send_datetime": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Deferred Send Datetime"
    }
  },
  "required": [
    "draft_id"
  ],
  "type": "object",
  "title": "outlook_update_draftArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_update_eventUpdate fields on an existing event (partial patch — only provided fields change).
Input schema
{
  "properties": {
    "event_id": {
      "title": "Event Id",
      "type": "string"
    },
    "subject": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Subject"
    },
    "start": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Start"
    },
    "end": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "End"
    },
    "location": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Location"
    },
    "body": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Body"
    }
  },
  "required": [
    "event_id"
  ],
  "type": "object",
  "title": "outlook_update_eventArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_update_taskUpdate fields on a To Do task (partial patch — only provided fields change).
Input schema
{
  "properties": {
    "task_id": {
      "title": "Task Id",
      "type": "string"
    },
    "list_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "List Id"
    },
    "title": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Title"
    },
    "due": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Due"
    },
    "body": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Body"
    },
    "importance": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Importance"
    }
  },
  "required": [
    "task_id"
  ],
  "type": "object",
  "title": "outlook_update_taskArguments"
}
Annotations
{
  "destructiveHint": false,
  "readOnlyHint": false
}
Writes · Non-destructive
outlook_whoamiGet the authenticated user's profile (display name, email, ID).
Input schema
{
  "properties": {},
  "type": "object",
  "title": "outlook_whoamiArguments"
}
Annotations
{
  "readOnlyHint": true
}
Read only · —

Resources 0

Resource templates 0

Prompts 0

Let’s talk about MCP security.

Share your details and our security team will contact you.