@softeria/ms-365-mcp-server 0.103.0 → 0.105.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.
@@ -1981,5 +1981,56 @@
1981
1981
  "toolName": "create-contact-in-folder",
1982
1982
  "scopes": ["Contacts.ReadWrite"],
1983
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."
2013
+ },
2014
+ {
2015
+ "pathPattern": "/me/onenote/pages",
2016
+ "method": "get",
2017
+ "toolName": "list-onenote-pages",
2018
+ "scopes": ["Notes.Read"],
2019
+ "llmTip": "Lists all OneNote pages across every notebook and section the user has access to — transverse alternative to walking notebooks → sections → pages. Default returns top 20 ordered by lastModifiedTime desc. Supports $search='query' for full-text search across page titles and bodies, $filter (e.g. lastModifiedTime gt 2026-01-01), $top (max 100), $select, and $expand=parentNotebook,parentSection. Use $search before bouncing through list-onenote-notebooks / list-all-onenote-sections / list-onenote-section-pages when you only have a topic in mind."
2020
+ },
2021
+ {
2022
+ "pathPattern": "/me/onenote/sectionGroups",
2023
+ "method": "get",
2024
+ "toolName": "list-onenote-section-groups",
2025
+ "scopes": ["Notes.Read"],
2026
+ "llmTip": "Lists all OneNote section groups (subfolders inside notebooks that contain their own sections and nested section groups) for the user. A section group is a folder-like container — many notebooks use them to organize sections by theme. Default sort is name asc. Supports $expand=sections,sectionGroups,parentNotebook,parentSectionGroup to traverse the full hierarchy. Pair with list-onenote-notebooks for a complete picture of the user's notebook structure."
2027
+ },
2028
+ {
2029
+ "pathPattern": "/me/onenote/notebooks/getNotebookFromWebUrl",
2030
+ "method": "post",
2031
+ "toolName": "get-onenote-notebook-from-web-url",
2032
+ "workScopes": ["Notes.Read"],
2033
+ "contentType": "application/json",
2034
+ "llmTip": "Resolves a OneNote notebook from its web URL (the link a user copies from OneNote / SharePoint / Teams). Body: { webUrl: 'https://...' }. Returns a CopyNotebookModel with the notebook's id, displayName, sectionsUrl, sectionGroupsUrl, and isShared — you can then list its sections via list-onenote-notebook-sections. Accepts user notebooks, group notebooks, and SharePoint-hosted team notebooks. Personal Microsoft accounts are not supported."
1984
2035
  }
1985
2036
  ]
@@ -3341,11 +3341,37 @@ const microsoft_graph_onenoteSectionCollectionResponse = z.object({
3341
3341
  "@odata.nextLink": z.string().nullable(),
3342
3342
  value: z.array(microsoft_graph_onenoteSection)
3343
3343
  }).partial().passthrough();
3344
+ const microsoft_graph_CopyNotebookModel = z.object({
3345
+ createdBy: z.string().nullish(),
3346
+ createdByIdentity: microsoft_graph_identitySet.optional(),
3347
+ createdTime: z.string().regex(
3348
+ /^[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])$/
3349
+ ).datetime({ offset: true }).nullish(),
3350
+ id: z.string().nullish(),
3351
+ isDefault: z.boolean().nullish(),
3352
+ isShared: z.boolean().nullish(),
3353
+ lastModifiedBy: z.string().nullish(),
3354
+ lastModifiedByIdentity: microsoft_graph_identitySet.optional(),
3355
+ lastModifiedTime: z.string().regex(
3356
+ /^[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])$/
3357
+ ).datetime({ offset: true }).nullish(),
3358
+ links: microsoft_graph_notebookLinks.optional(),
3359
+ name: z.string().nullish(),
3360
+ sectionGroupsUrl: z.string().nullish(),
3361
+ sectionsUrl: z.string().nullish(),
3362
+ self: z.string().nullish(),
3363
+ userRole: microsoft_graph_onenoteUserRole.optional()
3364
+ }).passthrough();
3344
3365
  const microsoft_graph_onenotePageCollectionResponse = z.object({
3345
3366
  "@odata.count": z.number().int().nullable(),
3346
3367
  "@odata.nextLink": z.string().nullable(),
3347
3368
  value: z.array(microsoft_graph_onenotePage)
3348
3369
  }).partial().passthrough();
3370
+ const microsoft_graph_sectionGroupCollectionResponse = z.object({
3371
+ "@odata.count": z.number().int().nullable(),
3372
+ "@odata.nextLink": z.string().nullable(),
3373
+ value: z.array(microsoft_graph_sectionGroup)
3374
+ }).partial().passthrough();
3349
3375
  const microsoft_graph_allowedLobbyAdmitterRoles = z.enum([
3350
3376
  "organizerAndCoOrganizersAndPresenters",
3351
3377
  "organizerAndCoOrganizers",
@@ -4883,7 +4909,9 @@ const schemas = {
4883
4909
  microsoft_graph_notebook,
4884
4910
  microsoft_graph_notebookCollectionResponse,
4885
4911
  microsoft_graph_onenoteSectionCollectionResponse,
4912
+ microsoft_graph_CopyNotebookModel,
4886
4913
  microsoft_graph_onenotePageCollectionResponse,
4914
+ microsoft_graph_sectionGroupCollectionResponse,
4887
4915
  microsoft_graph_allowedLobbyAdmitterRoles,
4888
4916
  microsoft_graph_onlineMeetingPresenters,
4889
4917
  microsoft_graph_meetingLiveShareOptions,
@@ -10333,6 +10361,72 @@ resource.`,
10333
10361
  ],
10334
10362
  response: z.void()
10335
10363
  },
10364
+ {
10365
+ method: "post",
10366
+ path: "/me/onenote/notebooks/getNotebookFromWebUrl",
10367
+ alias: "get-onenote-notebook-from-web-url",
10368
+ description: `Retrieve the properties and relationships of a notebook object by using its URL path. The location can be user notebooks on Microsoft 365, group notebooks, or SharePoint site-hosted team notebooks on Microsoft 365.`,
10369
+ requestFormat: "json",
10370
+ parameters: [
10371
+ {
10372
+ name: "body",
10373
+ description: `Action parameters`,
10374
+ type: "Body",
10375
+ schema: z.object({ webUrl: z.string().nullable() }).partial().passthrough()
10376
+ }
10377
+ ],
10378
+ response: z.void()
10379
+ },
10380
+ {
10381
+ method: "get",
10382
+ path: "/me/onenote/pages",
10383
+ alias: "list-onenote-pages",
10384
+ description: `Retrieve a list of page objects.`,
10385
+ requestFormat: "json",
10386
+ parameters: [
10387
+ {
10388
+ name: "$top",
10389
+ type: "Query",
10390
+ schema: z.number().int().gte(0).describe("Show only the first n items").optional()
10391
+ },
10392
+ {
10393
+ name: "$skip",
10394
+ type: "Query",
10395
+ schema: z.number().int().gte(0).describe("Skip the first n items").optional()
10396
+ },
10397
+ {
10398
+ name: "$search",
10399
+ type: "Query",
10400
+ schema: z.string().describe("Search items by search phrases").optional()
10401
+ },
10402
+ {
10403
+ name: "$filter",
10404
+ type: "Query",
10405
+ schema: z.string().describe("Filter items by property values").optional()
10406
+ },
10407
+ {
10408
+ name: "$count",
10409
+ type: "Query",
10410
+ schema: z.boolean().describe("Include count of items").optional()
10411
+ },
10412
+ {
10413
+ name: "$orderby",
10414
+ type: "Query",
10415
+ schema: z.array(z.string()).describe("Order items by property values").optional()
10416
+ },
10417
+ {
10418
+ name: "$select",
10419
+ type: "Query",
10420
+ schema: z.array(z.string()).describe("Select properties to be returned").optional()
10421
+ },
10422
+ {
10423
+ name: "$expand",
10424
+ type: "Query",
10425
+ schema: z.array(z.string()).describe("Expand related entities").optional()
10426
+ }
10427
+ ],
10428
+ response: z.void()
10429
+ },
10336
10430
  {
10337
10431
  method: "post",
10338
10432
  path: "/me/onenote/pages",
@@ -10372,6 +10466,56 @@ resource.`,
10372
10466
  requestFormat: "json",
10373
10467
  response: z.void()
10374
10468
  },
10469
+ {
10470
+ method: "get",
10471
+ path: "/me/onenote/sectionGroups",
10472
+ alias: "list-onenote-section-groups",
10473
+ description: `Retrieve a list of sectionGroup objects.`,
10474
+ requestFormat: "json",
10475
+ parameters: [
10476
+ {
10477
+ name: "$top",
10478
+ type: "Query",
10479
+ schema: z.number().int().gte(0).describe("Show only the first n items").optional()
10480
+ },
10481
+ {
10482
+ name: "$skip",
10483
+ type: "Query",
10484
+ schema: z.number().int().gte(0).describe("Skip the first n items").optional()
10485
+ },
10486
+ {
10487
+ name: "$search",
10488
+ type: "Query",
10489
+ schema: z.string().describe("Search items by search phrases").optional()
10490
+ },
10491
+ {
10492
+ name: "$filter",
10493
+ type: "Query",
10494
+ schema: z.string().describe("Filter items by property values").optional()
10495
+ },
10496
+ {
10497
+ name: "$count",
10498
+ type: "Query",
10499
+ schema: z.boolean().describe("Include count of items").optional()
10500
+ },
10501
+ {
10502
+ name: "$orderby",
10503
+ type: "Query",
10504
+ schema: z.array(z.string()).describe("Order items by property values").optional()
10505
+ },
10506
+ {
10507
+ name: "$select",
10508
+ type: "Query",
10509
+ schema: z.array(z.string()).describe("Select properties to be returned").optional()
10510
+ },
10511
+ {
10512
+ name: "$expand",
10513
+ type: "Query",
10514
+ schema: z.array(z.string()).describe("Expand related entities").optional()
10515
+ }
10516
+ ],
10517
+ response: z.void()
10518
+ },
10375
10519
  {
10376
10520
  method: "get",
10377
10521
  path: "/me/onenote/sections",
@@ -11141,6 +11285,22 @@ getting the user's mailbox settings.`,
11141
11285
  ],
11142
11286
  response: z.void()
11143
11287
  },
11288
+ {
11289
+ method: "put",
11290
+ path: "/me/photo/$value",
11291
+ alias: "upload-my-profile-photo",
11292
+ 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.`,
11293
+ requestFormat: "binary",
11294
+ parameters: [
11295
+ {
11296
+ name: "body",
11297
+ description: `New media content.`,
11298
+ type: "Body",
11299
+ schema: z.string().describe("Base64-encoded file content. The server decodes it and PUTs the raw bytes to Microsoft Graph.")
11300
+ }
11301
+ ],
11302
+ response: z.void()
11303
+ },
11144
11304
  {
11145
11305
  method: "get",
11146
11306
  path: "/me/planner/tasks",
@@ -11277,6 +11437,53 @@ getting the user's mailbox settings.`,
11277
11437
  ],
11278
11438
  response: z.void()
11279
11439
  },
11440
+ {
11441
+ method: "post",
11442
+ path: "/me/todo/lists",
11443
+ alias: "create-todo-task-list",
11444
+ description: `Create a new lists object.`,
11445
+ requestFormat: "json",
11446
+ parameters: [
11447
+ {
11448
+ name: "body",
11449
+ description: `New navigation property`,
11450
+ type: "Body",
11451
+ schema: microsoft_graph_todoTaskList
11452
+ }
11453
+ ],
11454
+ response: z.void()
11455
+ },
11456
+ {
11457
+ method: "patch",
11458
+ path: "/me/todo/lists/:todoTaskListId",
11459
+ alias: "update-todo-task-list",
11460
+ description: `Update the properties of a todoTaskList object.`,
11461
+ requestFormat: "json",
11462
+ parameters: [
11463
+ {
11464
+ name: "body",
11465
+ description: `New navigation property values`,
11466
+ type: "Body",
11467
+ schema: microsoft_graph_todoTaskList
11468
+ }
11469
+ ],
11470
+ response: z.void()
11471
+ },
11472
+ {
11473
+ method: "delete",
11474
+ path: "/me/todo/lists/:todoTaskListId",
11475
+ alias: "delete-todo-task-list",
11476
+ description: `Deletes a todoTaskList object.`,
11477
+ requestFormat: "json",
11478
+ parameters: [
11479
+ {
11480
+ name: "If-Match",
11481
+ type: "Header",
11482
+ schema: z.string().describe("ETag").optional()
11483
+ }
11484
+ ],
11485
+ response: z.void()
11486
+ },
11280
11487
  {
11281
11488
  method: "get",
11282
11489
  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.103.0",
3
+ "version": "0.105.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",
@@ -1981,5 +1981,56 @@
1981
1981
  "toolName": "create-contact-in-folder",
1982
1982
  "scopes": ["Contacts.ReadWrite"],
1983
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."
2013
+ },
2014
+ {
2015
+ "pathPattern": "/me/onenote/pages",
2016
+ "method": "get",
2017
+ "toolName": "list-onenote-pages",
2018
+ "scopes": ["Notes.Read"],
2019
+ "llmTip": "Lists all OneNote pages across every notebook and section the user has access to — transverse alternative to walking notebooks → sections → pages. Default returns top 20 ordered by lastModifiedTime desc. Supports $search='query' for full-text search across page titles and bodies, $filter (e.g. lastModifiedTime gt 2026-01-01), $top (max 100), $select, and $expand=parentNotebook,parentSection. Use $search before bouncing through list-onenote-notebooks / list-all-onenote-sections / list-onenote-section-pages when you only have a topic in mind."
2020
+ },
2021
+ {
2022
+ "pathPattern": "/me/onenote/sectionGroups",
2023
+ "method": "get",
2024
+ "toolName": "list-onenote-section-groups",
2025
+ "scopes": ["Notes.Read"],
2026
+ "llmTip": "Lists all OneNote section groups (subfolders inside notebooks that contain their own sections and nested section groups) for the user. A section group is a folder-like container — many notebooks use them to organize sections by theme. Default sort is name asc. Supports $expand=sections,sectionGroups,parentNotebook,parentSectionGroup to traverse the full hierarchy. Pair with list-onenote-notebooks for a complete picture of the user's notebook structure."
2027
+ },
2028
+ {
2029
+ "pathPattern": "/me/onenote/notebooks/getNotebookFromWebUrl",
2030
+ "method": "post",
2031
+ "toolName": "get-onenote-notebook-from-web-url",
2032
+ "workScopes": ["Notes.Read"],
2033
+ "contentType": "application/json",
2034
+ "llmTip": "Resolves a OneNote notebook from its web URL (the link a user copies from OneNote / SharePoint / Teams). Body: { webUrl: 'https://...' }. Returns a CopyNotebookModel with the notebook's id, displayName, sectionsUrl, sectionGroupsUrl, and isShared — you can then list its sections via list-onenote-notebook-sections. Accepts user notebooks, group notebooks, and SharePoint-hosted team notebooks. Personal Microsoft accounts are not supported."
1984
2035
  }
1985
2036
  ]