@softeria/ms-365-mcp-server 0.102.0 → 0.104.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1939,5 +1939,76 @@
1939
1939
  "toolName": "create-contact-child-folder",
1940
1940
  "scopes": ["Contacts.ReadWrite"],
1941
1941
  "llmTip": "Creates a sub-folder under an existing contact folder. Body: { displayName: 'Sub-folder name' }. Names must be unique among siblings under the same parent. Use list-contact-folders to discover the parent id. The returned contactFolder has its own id usable with update-contact-folder, delete-contact-folder, list-contact-folder-contacts, and create-contact-in-folder — contactFolder ids are mailbox-unique regardless of nesting depth."
1942
+ },
1943
+ {
1944
+ "pathPattern": "/me/contactFolders",
1945
+ "method": "get",
1946
+ "toolName": "list-contact-folders",
1947
+ "scopes": ["Contacts.Read"],
1948
+ "llmTip": "Lists the user's Outlook contact folders (the named buckets that organize contacts). Always includes the built-in 'Contacts' folder; user-created folders also appear. Returns id, displayName, parentFolderId, and wellKnownName ('contacts' for the default). Use this before list-contact-folder-contacts or create-contact-in-folder to discover folder ids. Supports $filter, $top, $orderby."
1949
+ },
1950
+ {
1951
+ "pathPattern": "/me/contactFolders",
1952
+ "method": "post",
1953
+ "toolName": "create-contact-folder",
1954
+ "scopes": ["Contacts.ReadWrite"],
1955
+ "llmTip": "Creates a new contact folder under the user's mailbox root. Body: { displayName: 'Family' }. Returns the created contactFolder with its id. Folder names must be unique among siblings. To create a sub-folder, POST to /me/contactFolders/{parent-id}/childFolders instead — not currently exposed."
1956
+ },
1957
+ {
1958
+ "pathPattern": "/me/contactFolders/{contactFolder-id}",
1959
+ "method": "patch",
1960
+ "toolName": "update-contact-folder",
1961
+ "scopes": ["Contacts.ReadWrite"],
1962
+ "llmTip": "Renames a contact folder. Body: { displayName: 'New name' }. Only displayName is writable. The default 'Contacts' folder cannot be renamed — Graph returns an error. Get the folder id via list-contact-folders."
1963
+ },
1964
+ {
1965
+ "pathPattern": "/me/contactFolders/{contactFolder-id}",
1966
+ "method": "delete",
1967
+ "toolName": "delete-contact-folder",
1968
+ "scopes": ["Contacts.ReadWrite"],
1969
+ "llmTip": "Deletes a contact folder and ALL contacts in it (cascades). The default 'Contacts' folder cannot be deleted — Graph returns an error. Get the folder id via list-contact-folders. Operation is irreversible."
1970
+ },
1971
+ {
1972
+ "pathPattern": "/me/contactFolders/{contactFolder-id}/contacts",
1973
+ "method": "get",
1974
+ "toolName": "list-contact-folder-contacts",
1975
+ "scopes": ["Contacts.Read"],
1976
+ "llmTip": "Lists contacts inside a specific folder. Pair with list-contact-folders to discover the folder id. Note: the existing list-outlook-contacts (GET /me/contacts) only returns contacts from the default folder — use this tool to read contacts from any folder. Supports $filter, $search='query', $orderby, $top, $select."
1977
+ },
1978
+ {
1979
+ "pathPattern": "/me/contactFolders/{contactFolder-id}/contacts",
1980
+ "method": "post",
1981
+ "toolName": "create-contact-in-folder",
1982
+ "scopes": ["Contacts.ReadWrite"],
1983
+ "llmTip": "Creates a contact inside a specific folder (instead of the default Contacts folder). Body is a contact resource: { givenName, surname, displayName, emailAddresses: [{ address, name }], businessPhones: [], mobilePhone, jobTitle, companyName, ... }. The existing create-outlook-contact (POST /me/contacts) writes to the default folder only; use this when organizing contacts into named folders. Get the folder id via list-contact-folders."
1984
+ },
1985
+ {
1986
+ "pathPattern": "/me/photo/$value",
1987
+ "method": "put",
1988
+ "toolName": "upload-my-profile-photo",
1989
+ "scopes": ["User.ReadWrite"],
1990
+ "contentType": "image/jpeg",
1991
+ "llmTip": "Uploads a new profile photo for the signed-in user. Body is a base64-encoded string of the image bytes (the server decodes before PUT). Photo must be JPEG, max 4 MB. Microsoft 365 generates HD downsized variants automatically (48x48, 64x64, 96x96, 120x120, 240x240, 360x360, 432x432, 504x504, 648x648). For work or school accounts, ProfilePhoto.ReadWrite.All is the more granular alternative permission. Use download-bytes with target=/me/photo/$value to retrieve the current photo."
1992
+ },
1993
+ {
1994
+ "pathPattern": "/me/todo/lists",
1995
+ "method": "post",
1996
+ "toolName": "create-todo-task-list",
1997
+ "scopes": ["Tasks.ReadWrite"],
1998
+ "llmTip": "Creates a new Microsoft To Do task list (the named buckets shown in the To Do app sidebar). Body: { displayName: 'My new list' }. Returns the created todoTaskList with its id, displayName, isOwner, isShared, and wellknownListName ('none' for user-created lists). The built-in lists ('Tasks', 'Flagged emails') already exist and cannot be re-created. Pair with create-todo-task to populate it."
1999
+ },
2000
+ {
2001
+ "pathPattern": "/me/todo/lists/{todoTaskList-id}",
2002
+ "method": "patch",
2003
+ "toolName": "update-todo-task-list",
2004
+ "scopes": ["Tasks.ReadWrite"],
2005
+ "llmTip": "Renames a Microsoft To Do task list. Body: { displayName: 'New name' }. Only displayName is writable. Built-in lists (Flagged emails, the default Tasks list) cannot be renamed — the API returns an error. Get list ids via list-todo-task-lists."
2006
+ },
2007
+ {
2008
+ "pathPattern": "/me/todo/lists/{todoTaskList-id}",
2009
+ "method": "delete",
2010
+ "toolName": "delete-todo-task-list",
2011
+ "scopes": ["Tasks.ReadWrite"],
2012
+ "llmTip": "Deletes a Microsoft To Do task list and ALL of its tasks (cascades). Built-in lists cannot be deleted — the API returns an error for those. Get list ids via list-todo-task-lists. Operation is irreversible."
1942
2013
  }
1943
2014
  ]
@@ -7923,6 +7923,103 @@ or from some other calendar of the user.`,
7923
7923
  ],
7924
7924
  response: z.void()
7925
7925
  },
7926
+ {
7927
+ method: "get",
7928
+ path: "/me/contactFolders",
7929
+ alias: "list-contact-folders",
7930
+ description: `Get the contact folder collection in the default Contacts folder of the signed-in user.`,
7931
+ requestFormat: "json",
7932
+ parameters: [
7933
+ {
7934
+ name: "$top",
7935
+ type: "Query",
7936
+ schema: z.number().int().gte(0).describe("Show only the first n items").optional()
7937
+ },
7938
+ {
7939
+ name: "$skip",
7940
+ type: "Query",
7941
+ schema: z.number().int().gte(0).describe("Skip the first n items").optional()
7942
+ },
7943
+ {
7944
+ name: "$search",
7945
+ type: "Query",
7946
+ schema: z.string().describe("Search items by search phrases").optional()
7947
+ },
7948
+ {
7949
+ name: "$filter",
7950
+ type: "Query",
7951
+ schema: z.string().describe("Filter items by property values").optional()
7952
+ },
7953
+ {
7954
+ name: "$count",
7955
+ type: "Query",
7956
+ schema: z.boolean().describe("Include count of items").optional()
7957
+ },
7958
+ {
7959
+ name: "$orderby",
7960
+ type: "Query",
7961
+ schema: z.array(z.string()).describe("Order items by property values").optional()
7962
+ },
7963
+ {
7964
+ name: "$select",
7965
+ type: "Query",
7966
+ schema: z.array(z.string()).describe("Select properties to be returned").optional()
7967
+ },
7968
+ {
7969
+ name: "$expand",
7970
+ type: "Query",
7971
+ schema: z.array(z.string()).describe("Expand related entities").optional()
7972
+ }
7973
+ ],
7974
+ response: z.void()
7975
+ },
7976
+ {
7977
+ method: "post",
7978
+ path: "/me/contactFolders",
7979
+ alias: "create-contact-folder",
7980
+ description: `Create a new contactFolder under the user's default contacts folder. You can also create a new contactfolder as a child of any specified contact folder.`,
7981
+ requestFormat: "json",
7982
+ parameters: [
7983
+ {
7984
+ name: "body",
7985
+ description: `New navigation property`,
7986
+ type: "Body",
7987
+ schema: microsoft_graph_contactFolder
7988
+ }
7989
+ ],
7990
+ response: z.void()
7991
+ },
7992
+ {
7993
+ method: "patch",
7994
+ path: "/me/contactFolders/:contactFolderId",
7995
+ alias: "update-contact-folder",
7996
+ description: `Update the properties of contactfolder object.`,
7997
+ requestFormat: "json",
7998
+ parameters: [
7999
+ {
8000
+ name: "body",
8001
+ description: `New navigation property values`,
8002
+ type: "Body",
8003
+ schema: microsoft_graph_contactFolder
8004
+ }
8005
+ ],
8006
+ response: z.void()
8007
+ },
8008
+ {
8009
+ method: "delete",
8010
+ path: "/me/contactFolders/:contactFolderId",
8011
+ alias: "delete-contact-folder",
8012
+ description: `Delete contactFolder other than the default contactFolder.`,
8013
+ requestFormat: "json",
8014
+ parameters: [
8015
+ {
8016
+ name: "If-Match",
8017
+ type: "Header",
8018
+ schema: z.string().describe("ETag").optional()
8019
+ }
8020
+ ],
8021
+ response: z.void()
8022
+ },
7926
8023
  {
7927
8024
  method: "get",
7928
8025
  path: "/me/contactFolders/:contactFolderId/childFolders",
@@ -7989,6 +8086,118 @@ or from some other calendar of the user.`,
7989
8086
  ],
7990
8087
  response: z.void()
7991
8088
  },
8089
+ {
8090
+ method: "get",
8091
+ path: "/me/contactFolders/:contactFolderId/contacts",
8092
+ alias: "list-contact-folder-contacts",
8093
+ description: `Get a contact collection from the default Contacts folder of the signed-in user (.../me/contacts), or from the specified contact folder.`,
8094
+ requestFormat: "json",
8095
+ parameters: [
8096
+ {
8097
+ name: "$top",
8098
+ type: "Query",
8099
+ schema: z.number().int().gte(0).describe("Show only the first n items").optional()
8100
+ },
8101
+ {
8102
+ name: "$skip",
8103
+ type: "Query",
8104
+ schema: z.number().int().gte(0).describe("Skip the first n items").optional()
8105
+ },
8106
+ {
8107
+ name: "$search",
8108
+ type: "Query",
8109
+ schema: z.string().describe("Search items by search phrases").optional()
8110
+ },
8111
+ {
8112
+ name: "$filter",
8113
+ type: "Query",
8114
+ schema: z.string().describe("Filter items by property values").optional()
8115
+ },
8116
+ {
8117
+ name: "$count",
8118
+ type: "Query",
8119
+ schema: z.boolean().describe("Include count of items").optional()
8120
+ },
8121
+ {
8122
+ name: "$orderby",
8123
+ type: "Query",
8124
+ schema: z.array(z.string()).describe("Order items by property values").optional()
8125
+ },
8126
+ {
8127
+ name: "$select",
8128
+ type: "Query",
8129
+ schema: z.array(z.string()).describe("Select properties to be returned").optional()
8130
+ },
8131
+ {
8132
+ name: "$expand",
8133
+ type: "Query",
8134
+ schema: z.array(z.string()).describe("Expand related entities").optional()
8135
+ }
8136
+ ],
8137
+ response: z.void()
8138
+ },
8139
+ {
8140
+ method: "post",
8141
+ path: "/me/contactFolders/:contactFolderId/contacts",
8142
+ alias: "create-contact-in-folder",
8143
+ description: `Add a contact to the root Contacts folder or to the contacts endpoint of another contact folder.`,
8144
+ requestFormat: "json",
8145
+ parameters: [
8146
+ {
8147
+ name: "body",
8148
+ description: `New navigation property`,
8149
+ type: "Body",
8150
+ schema: z.object({
8151
+ id: z.string().describe("The unique identifier for an entity. Read-only.").optional(),
8152
+ displayName: z.string().describe(
8153
+ "The contact's display name. You can specify the display name in a create or update operation. Note that later updates to other properties may cause an automatically generated value to overwrite the displayName value you have specified. To preserve a pre-existing value, always include it as displayName in an update operation."
8154
+ ).nullish(),
8155
+ createdDateTime: z.string().regex(
8156
+ /^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?(Z|[+-][0-9][0-9]:[0-9][0-9])$/
8157
+ ).datetime({ offset: true }).describe(
8158
+ "The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z"
8159
+ ).nullish(),
8160
+ lastModifiedDateTime: z.string().regex(
8161
+ /^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?(Z|[+-][0-9][0-9]:[0-9][0-9])$/
8162
+ ).datetime({ offset: true }).describe(
8163
+ "The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z"
8164
+ ).nullish(),
8165
+ title: z.string().describe("The contact's title.").nullish(),
8166
+ singleValueExtendedProperties: z.array(microsoft_graph_singleValueLegacyExtendedProperty).describe(
8167
+ "The collection of single-value extended properties defined for the contact. Read-only. Nullable."
8168
+ ).optional(),
8169
+ multiValueExtendedProperties: z.array(microsoft_graph_multiValueLegacyExtendedProperty).describe(
8170
+ "The collection of multi-value extended properties defined for the contact. Read-only. Nullable."
8171
+ ).optional(),
8172
+ categories: z.array(z.string().nullable()).describe("The categories associated with the item").optional(),
8173
+ changeKey: z.string().describe(
8174
+ "Identifies the version of the item. Every time the item is changed, changeKey changes as well. This allows Exchange to apply changes to the correct version of the object. Read-only."
8175
+ ).nullish(),
8176
+ assistantName: z.string().describe("The name of the contact's assistant.").nullish(),
8177
+ birthday: z.string().regex(
8178
+ /^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?(Z|[+-][0-9][0-9]:[0-9][0-9])$/
8179
+ ).datetime({ offset: true }).describe(
8180
+ "The contact's birthday. The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z"
8181
+ ).nullish(),
8182
+ businessAddress: microsoft_graph_physicalAddress.optional(),
8183
+ businessHomePage: z.string().describe("The business home page of the contact.").nullish(),
8184
+ businessPhones: z.array(z.string().nullable()).describe("The contact's business phone numbers.").optional(),
8185
+ children: z.array(z.string().nullable()).describe("The names of the contact's children.").optional(),
8186
+ companyName: z.string().describe("The name of the contact's company.").nullish(),
8187
+ department: z.string().describe("The contact's department.").nullish(),
8188
+ emailAddresses: z.array(microsoft_graph_emailAddress).describe("The contact's email addresses.").optional(),
8189
+ fileAs: z.string().describe("The name the contact is filed under.").nullish(),
8190
+ generation: z.string().describe("The contact's suffix.").nullish(),
8191
+ givenName: z.string().describe("The contact's given name.").nullish(),
8192
+ homeAddress: microsoft_graph_physicalAddress.optional(),
8193
+ homePhones: z.array(z.string().nullable()).describe("The contact's home phone numbers.").optional(),
8194
+ imAddresses: z.array(z.string().nullable()).describe("The contact's instant messaging (IM) addresses.").optional(),
8195
+ initials: z.string().describe("The contact's initials.").nullish()
8196
+ }).passthrough().passthrough()
8197
+ }
8198
+ ],
8199
+ response: z.void()
8200
+ },
7992
8201
  {
7993
8202
  method: "get",
7994
8203
  path: "/me/contacts",
@@ -10932,6 +11141,22 @@ getting the user's mailbox settings.`,
10932
11141
  ],
10933
11142
  response: z.void()
10934
11143
  },
11144
+ {
11145
+ method: "put",
11146
+ path: "/me/photo/$value",
11147
+ alias: "upload-my-profile-photo",
11148
+ description: `Update the photo for the specified contact, group, team, or user in a tenant. The size of the photo you can update to is limited to 4 MB. You can use either PATCH or PUT for this operation.`,
11149
+ requestFormat: "binary",
11150
+ parameters: [
11151
+ {
11152
+ name: "body",
11153
+ description: `New media content.`,
11154
+ type: "Body",
11155
+ schema: z.string().describe("Base64-encoded file content. The server decodes it and PUTs the raw bytes to Microsoft Graph.")
11156
+ }
11157
+ ],
11158
+ response: z.void()
11159
+ },
10935
11160
  {
10936
11161
  method: "get",
10937
11162
  path: "/me/planner/tasks",
@@ -11068,6 +11293,53 @@ getting the user's mailbox settings.`,
11068
11293
  ],
11069
11294
  response: z.void()
11070
11295
  },
11296
+ {
11297
+ method: "post",
11298
+ path: "/me/todo/lists",
11299
+ alias: "create-todo-task-list",
11300
+ description: `Create a new lists object.`,
11301
+ requestFormat: "json",
11302
+ parameters: [
11303
+ {
11304
+ name: "body",
11305
+ description: `New navigation property`,
11306
+ type: "Body",
11307
+ schema: microsoft_graph_todoTaskList
11308
+ }
11309
+ ],
11310
+ response: z.void()
11311
+ },
11312
+ {
11313
+ method: "patch",
11314
+ path: "/me/todo/lists/:todoTaskListId",
11315
+ alias: "update-todo-task-list",
11316
+ description: `Update the properties of a todoTaskList object.`,
11317
+ requestFormat: "json",
11318
+ parameters: [
11319
+ {
11320
+ name: "body",
11321
+ description: `New navigation property values`,
11322
+ type: "Body",
11323
+ schema: microsoft_graph_todoTaskList
11324
+ }
11325
+ ],
11326
+ response: z.void()
11327
+ },
11328
+ {
11329
+ method: "delete",
11330
+ path: "/me/todo/lists/:todoTaskListId",
11331
+ alias: "delete-todo-task-list",
11332
+ description: `Deletes a todoTaskList object.`,
11333
+ requestFormat: "json",
11334
+ parameters: [
11335
+ {
11336
+ name: "If-Match",
11337
+ type: "Header",
11338
+ schema: z.string().describe("ETag").optional()
11339
+ }
11340
+ ],
11341
+ response: z.void()
11342
+ },
11071
11343
  {
11072
11344
  method: "get",
11073
11345
  path: "/me/todo/lists/:todoTaskListId/tasks",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@softeria/ms-365-mcp-server",
3
- "version": "0.102.0",
3
+ "version": "0.104.0",
4
4
  "description": " A Model Context Protocol (MCP) server for interacting with Microsoft 365 and Office services through the Graph API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1939,5 +1939,76 @@
1939
1939
  "toolName": "create-contact-child-folder",
1940
1940
  "scopes": ["Contacts.ReadWrite"],
1941
1941
  "llmTip": "Creates a sub-folder under an existing contact folder. Body: { displayName: 'Sub-folder name' }. Names must be unique among siblings under the same parent. Use list-contact-folders to discover the parent id. The returned contactFolder has its own id usable with update-contact-folder, delete-contact-folder, list-contact-folder-contacts, and create-contact-in-folder — contactFolder ids are mailbox-unique regardless of nesting depth."
1942
+ },
1943
+ {
1944
+ "pathPattern": "/me/contactFolders",
1945
+ "method": "get",
1946
+ "toolName": "list-contact-folders",
1947
+ "scopes": ["Contacts.Read"],
1948
+ "llmTip": "Lists the user's Outlook contact folders (the named buckets that organize contacts). Always includes the built-in 'Contacts' folder; user-created folders also appear. Returns id, displayName, parentFolderId, and wellKnownName ('contacts' for the default). Use this before list-contact-folder-contacts or create-contact-in-folder to discover folder ids. Supports $filter, $top, $orderby."
1949
+ },
1950
+ {
1951
+ "pathPattern": "/me/contactFolders",
1952
+ "method": "post",
1953
+ "toolName": "create-contact-folder",
1954
+ "scopes": ["Contacts.ReadWrite"],
1955
+ "llmTip": "Creates a new contact folder under the user's mailbox root. Body: { displayName: 'Family' }. Returns the created contactFolder with its id. Folder names must be unique among siblings. To create a sub-folder, POST to /me/contactFolders/{parent-id}/childFolders instead — not currently exposed."
1956
+ },
1957
+ {
1958
+ "pathPattern": "/me/contactFolders/{contactFolder-id}",
1959
+ "method": "patch",
1960
+ "toolName": "update-contact-folder",
1961
+ "scopes": ["Contacts.ReadWrite"],
1962
+ "llmTip": "Renames a contact folder. Body: { displayName: 'New name' }. Only displayName is writable. The default 'Contacts' folder cannot be renamed — Graph returns an error. Get the folder id via list-contact-folders."
1963
+ },
1964
+ {
1965
+ "pathPattern": "/me/contactFolders/{contactFolder-id}",
1966
+ "method": "delete",
1967
+ "toolName": "delete-contact-folder",
1968
+ "scopes": ["Contacts.ReadWrite"],
1969
+ "llmTip": "Deletes a contact folder and ALL contacts in it (cascades). The default 'Contacts' folder cannot be deleted — Graph returns an error. Get the folder id via list-contact-folders. Operation is irreversible."
1970
+ },
1971
+ {
1972
+ "pathPattern": "/me/contactFolders/{contactFolder-id}/contacts",
1973
+ "method": "get",
1974
+ "toolName": "list-contact-folder-contacts",
1975
+ "scopes": ["Contacts.Read"],
1976
+ "llmTip": "Lists contacts inside a specific folder. Pair with list-contact-folders to discover the folder id. Note: the existing list-outlook-contacts (GET /me/contacts) only returns contacts from the default folder — use this tool to read contacts from any folder. Supports $filter, $search='query', $orderby, $top, $select."
1977
+ },
1978
+ {
1979
+ "pathPattern": "/me/contactFolders/{contactFolder-id}/contacts",
1980
+ "method": "post",
1981
+ "toolName": "create-contact-in-folder",
1982
+ "scopes": ["Contacts.ReadWrite"],
1983
+ "llmTip": "Creates a contact inside a specific folder (instead of the default Contacts folder). Body is a contact resource: { givenName, surname, displayName, emailAddresses: [{ address, name }], businessPhones: [], mobilePhone, jobTitle, companyName, ... }. The existing create-outlook-contact (POST /me/contacts) writes to the default folder only; use this when organizing contacts into named folders. Get the folder id via list-contact-folders."
1984
+ },
1985
+ {
1986
+ "pathPattern": "/me/photo/$value",
1987
+ "method": "put",
1988
+ "toolName": "upload-my-profile-photo",
1989
+ "scopes": ["User.ReadWrite"],
1990
+ "contentType": "image/jpeg",
1991
+ "llmTip": "Uploads a new profile photo for the signed-in user. Body is a base64-encoded string of the image bytes (the server decodes before PUT). Photo must be JPEG, max 4 MB. Microsoft 365 generates HD downsized variants automatically (48x48, 64x64, 96x96, 120x120, 240x240, 360x360, 432x432, 504x504, 648x648). For work or school accounts, ProfilePhoto.ReadWrite.All is the more granular alternative permission. Use download-bytes with target=/me/photo/$value to retrieve the current photo."
1992
+ },
1993
+ {
1994
+ "pathPattern": "/me/todo/lists",
1995
+ "method": "post",
1996
+ "toolName": "create-todo-task-list",
1997
+ "scopes": ["Tasks.ReadWrite"],
1998
+ "llmTip": "Creates a new Microsoft To Do task list (the named buckets shown in the To Do app sidebar). Body: { displayName: 'My new list' }. Returns the created todoTaskList with its id, displayName, isOwner, isShared, and wellknownListName ('none' for user-created lists). The built-in lists ('Tasks', 'Flagged emails') already exist and cannot be re-created. Pair with create-todo-task to populate it."
1999
+ },
2000
+ {
2001
+ "pathPattern": "/me/todo/lists/{todoTaskList-id}",
2002
+ "method": "patch",
2003
+ "toolName": "update-todo-task-list",
2004
+ "scopes": ["Tasks.ReadWrite"],
2005
+ "llmTip": "Renames a Microsoft To Do task list. Body: { displayName: 'New name' }. Only displayName is writable. Built-in lists (Flagged emails, the default Tasks list) cannot be renamed — the API returns an error. Get list ids via list-todo-task-lists."
2006
+ },
2007
+ {
2008
+ "pathPattern": "/me/todo/lists/{todoTaskList-id}",
2009
+ "method": "delete",
2010
+ "toolName": "delete-todo-task-list",
2011
+ "scopes": ["Tasks.ReadWrite"],
2012
+ "llmTip": "Deletes a Microsoft To Do task list and ALL of its tasks (cascades). Built-in lists cannot be deleted — the API returns an error for those. Get list ids via list-todo-task-lists. Operation is irreversible."
1942
2013
  }
1943
2014
  ]