Outlook MCP: add list_mail_folders + move_mail_message

Feature request for product/service

Cursor IDE

Describe the request

Please extend the hosted Outlook MCP (plugin-outlook-outlook / https://api.cursor.com/rest-mcp/outlook/mcp) with two Graph tools so agents can file mail into folders. Auth/OAuth is already working; we only need more tools on the same token.

Use case: Agent (including Grok via Cursor) lists folders, then moves messages into them after triage.

Existing tools we use: list_mail_messages (has mailFolder), get_mail_message, send_mail, get_me.

Missing:

list_mail_folders → GET /me/mailFolders (+ optional child folders)
move_mail_message → POST /me/messages/{id}/move with { “destinationId”: “<folderId|wellKnown>” }
Scopes (if not already granted): Mail.ReadWrite (move) in addition to read/send. Prefer delegated signed-in user, same as today.

Tool schemas below.

Tool schemas (match existing style)

list_mail_folders
{
“name”: “list_mail_folders”,
“description”: “List mail folders for the signed-in user. Returns raw Microsoft Graph JSON (id, displayName, parentFolderId, childFolderCount, totalItemCount, unreadItemCount).”,
“graph”: “GET /me/mailFolders OR GET /me/mailFolders/{id}/childFolders”,
“inputSchema”: {
“type”: “object”,
“properties”: {
“parentFolderId”: {
“type”: “string”,
“description”: “If set, list childFolders of this folder id or well-known name (e.g. inbox). Omit for top-level /me/mailFolders.”
},
“includeHiddenFolders”: {
“type”: “boolean”,
“description”: “Pass includeHiddenFolders=true when listing.”
},
“select”: {
“type”: “string”,
“description”: “OData $select, e.g. "id,displayName,parentFolderId,childFolderCount,totalItemCount,unreadItemCount".”
},
“top”: {
“type”: “integer”,
“minimum”: 1,
“maximum”: 100
}
},
“additionalProperties”: false
}
}

move_mail_message
{
“name”: “move_mail_message”,
“description”: “Move a message to another mail folder. Graph creates a copy in the destination and removes the original; returns the new message JSON (new id).”,
“graph”: “POST /me/messages/{messageId}/move”,
“inputSchema”: {
“type”: “object”,
“properties”: {
“messageId”: {
“type”: “string”,
“description”: “The message id to move.”
},
“destinationId”: {
“type”: “string”,
“description”: “Destination folder id, or well-known name: inbox, drafts, deleteditems, sentitems, junkemail, archive, etc.”
}
},
“required”: [“messageId”, “destinationId”],
“additionalProperties”: false
}
}

Hey @Chris_Prewitt, thanks for the detailed suggestion!.

Filing mail into folders from the Outlook plugin is on the team’s radar. The move step requires a broader mailbox permission than the plugin requests today, so it is not just a matter of adding the tool, but we are looking into it.

In the meantime, list_mail_messages already accepts a mailFolder (id or well-known name like inbox or archive), so reading from a specific folder works now.

Thanks, the use case is to allow a Grok Bot to clean up an inbox by filing emails.