@softeria/ms-365-mcp-server 0.89.0 → 0.91.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.
@@ -500,6 +500,27 @@
500
500
  "scopes": ["Files.ReadWrite"],
501
501
  "llmTip": "Shares a file or folder with specific users. Body: { recipients: [{ email: 'user@example.com' }], roles: ['read'], sendInvitation: true, message: 'Please review this file.' }. Roles: 'read', 'write', 'owner'. Set requireSignIn to true to require authentication."
502
502
  },
503
+ {
504
+ "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/createLink",
505
+ "method": "post",
506
+ "toolName": "create-drive-item-share-link",
507
+ "scopes": ["Files.ReadWrite"],
508
+ "llmTip": "Create a shareable link for a file or folder WITHOUT sending an email invitation. Body: { type: 'view' | 'edit' | 'embed', scope: 'anonymous' | 'organization' | 'users', password?: string, expirationDateTime?: ISO-8601, retainInheritedPermissions?: boolean }. Returns a permission with link.webUrl. Pair with share-drive-item when you want to grant explicit access; use this when you only need a URL to paste into a doc/email/chat without triggering OneDrive notifications."
509
+ },
510
+ {
511
+ "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/copy",
512
+ "method": "post",
513
+ "toolName": "copy-drive-item",
514
+ "scopes": ["Files.ReadWrite"],
515
+ "llmTip": "Asynchronously copy a file or folder to a new location and/or name. Body: { parentReference: { driveId: '...', id: '...' }, name?: 'New Name.xlsx' }. Returns 202 Accepted with a Location header pointing at a monitor URL for the async job. Ideal for duplicating templates (e.g. clone an Armhr Census Template per prospect), bulk file provisioning, or preserving an immutable snapshot of a working file."
516
+ },
517
+ {
518
+ "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/preview",
519
+ "method": "post",
520
+ "toolName": "create-drive-item-preview",
521
+ "scopes": ["Files.Read"],
522
+ "llmTip": "Generate a short-lived embeddable preview URL for a file (Office docs, PDFs, images). Body: { page?: number | string, zoom?: number, viewer?: 'onedrive' | 'office' }. Returns getUrl (interactive) and postUrl (form-post). Useful for surfacing inline previews in summary emails or chat messages without needing the recipient to open the file."
523
+ },
503
524
  {
504
525
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/permissions",
505
526
  "method": "get",
@@ -1736,5 +1757,33 @@
1736
1757
  "toolName": "get-sensitivity-label",
1737
1758
  "workScopes": ["SensitivityLabel.Read"],
1738
1759
  "llmTip": "Gets a single MIP sensitivity label by id. Use list-sensitivity-labels to find ids. Not supported for personal Microsoft accounts."
1760
+ },
1761
+ {
1762
+ "pathPattern": "/me/messages/{message-id}/copy",
1763
+ "method": "post",
1764
+ "toolName": "copy-mail-message",
1765
+ "scopes": ["Mail.ReadWrite"],
1766
+ "llmTip": "Copies a message to another mail folder. Body: { DestinationId: '<mailFolder-id or well-known name like inbox, archive, junkemail>' }. Returns the newly created message (with a new id) in the destination folder. For moving instead of copying, use move-mail-message."
1767
+ },
1768
+ {
1769
+ "pathPattern": "/me/mailFolders/{mailFolder-id}/messages/delta()",
1770
+ "method": "get",
1771
+ "toolName": "list-mail-folder-messages-delta",
1772
+ "scopes": ["Mail.Read"],
1773
+ "llmTip": "Incremental sync of messages within a mail folder. Graph only supports delta scoped to a folder — use mailFolder-id = 'inbox' for the well-known inbox, or another folder id from list-mail-folders. First call returns all messages plus @odata.deltaLink; subsequent calls with that link return only changes (created/updated/deleted). @odata.nextLink paginates within a single delta window. Deltas expire after ~30 days of inactivity — start over if the server returns 410. Prefer this over full re-list for polling."
1774
+ },
1775
+ {
1776
+ "pathPattern": "/me/outlook/masterCategories",
1777
+ "method": "get",
1778
+ "toolName": "list-outlook-categories",
1779
+ "scopes": ["MailboxSettings.Read"],
1780
+ "llmTip": "Lists the user's Outlook categories (colored labels) used to tag messages, events, contacts, and tasks. Each category has displayName and color (preset0 through preset24, or 'none'). Use this to show available tags before applying via update-mail-message or update-calendar-event with body { categories: ['Category Name'] }."
1781
+ },
1782
+ {
1783
+ "pathPattern": "/me/outlook/masterCategories",
1784
+ "method": "post",
1785
+ "toolName": "create-outlook-category",
1786
+ "scopes": ["MailboxSettings.ReadWrite"],
1787
+ "llmTip": "Creates a new Outlook category. Body: { displayName (unique), color (one of: none, preset0 … preset24 — maps to red, orange, yellow, green, teal, olive, blue, purple, cranberry, steel, dark-steel, gray, dark-gray, black, dark-red, dark-orange, dark-yellow, dark-green, dark-teal, dark-olive, dark-blue, dark-purple, dark-cranberry) }. Category names are case-sensitive when applied to messages/events."
1739
1788
  }
1740
1789
  ]
@@ -763,46 +763,24 @@ const microsoft_graph_driveItemCollectionResponse = z.object({
763
763
  "@odata.nextLink": z.string().nullable(),
764
764
  value: z.array(microsoft_graph_driveItem)
765
765
  }).partial().passthrough();
766
- const create_upload_session_Body = z.object({ item: z.object({}).partial().passthrough() }).partial().passthrough();
767
- const microsoft_graph_uploadSession = z.object({
766
+ const copy_drive_item_Body = z.object({
767
+ name: z.string().nullable(),
768
+ parentReference: z.union([microsoft_graph_itemReference, z.object({}).partial().passthrough()]),
769
+ childrenOnly: z.boolean().nullable().default(false),
770
+ includeAllVersionHistory: z.boolean().nullable().default(false)
771
+ }).partial().passthrough();
772
+ const create_drive_item_share_link_Body = z.object({
773
+ type: z.string().nullable(),
774
+ scope: z.string().nullable(),
768
775
  expirationDateTime: z.string().regex(
769
776
  /^[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])$/
770
- ).datetime({ offset: true }).describe(
771
- "The date and time in UTC that the upload session expires. The complete file must be uploaded before this expiration time is reached. Each fragment uploaded during the session extends the expiration time."
772
- ).nullish(),
773
- nextExpectedRanges: z.array(z.string().nullable()).describe(
774
- "A collection of byte ranges that the server is missing for the file. These ranges are zero indexed and of the format 'start-end' (for example '0-26' to indicate the first 27 bytes of the file). When uploading files as Outlook attachments, instead of a collection of ranges, this property always indicates a single value '{start}', the location in the file where the next upload should begin."
775
- ).optional(),
776
- uploadUrl: z.string().describe("The URL endpoint that accepts PUT requests for byte ranges of the file.").nullish()
777
- }).passthrough();
778
- const BaseDeltaFunctionResponse = z.object({ "@odata.nextLink": z.string().nullable(), "@odata.deltaLink": z.string().nullable() }).partial().passthrough();
779
- const microsoft_graph_sensitivityLabelAssignmentMethod = z.enum([
780
- "standard",
781
- "privileged",
782
- "auto",
783
- "unknownFutureValue"
784
- ]);
785
- const microsoft_graph_sensitivityLabelAssignment = z.object({
786
- assignmentMethod: microsoft_graph_sensitivityLabelAssignmentMethod.optional(),
787
- sensitivityLabelId: z.string().describe("The unique identifier for the sensitivity label assigned to the file.").optional(),
788
- tenantId: z.string().describe(
789
- "The unique identifier for the tenant that hosts the file when this label is applied."
790
- ).optional()
791
- }).passthrough();
792
- const microsoft_graph_extractSensitivityLabelsResult = z.object({
793
- labels: z.array(microsoft_graph_sensitivityLabelAssignment).describe("List of sensitivity labels assigned to a file.").optional()
794
- }).passthrough();
795
- const share_drive_item_Body = z.object({
796
- requireSignIn: z.boolean().nullable().default(false),
797
- roles: z.array(z.string().nullable()),
798
- sendInvitation: z.boolean().nullable().default(false),
777
+ ).datetime({ offset: true }).nullable(),
778
+ password: z.string().nullable(),
799
779
  message: z.string().nullable(),
800
780
  recipients: z.array(z.object({}).partial().passthrough()),
801
781
  retainInheritedPermissions: z.boolean().nullable().default(false),
802
- expirationDateTime: z.string().nullable(),
803
- password: z.string().nullable()
782
+ sendNotification: z.boolean().nullable().default(false)
804
783
  }).partial().passthrough();
805
- const BaseCollectionPaginationCountResponse = z.object({ "@odata.count": z.number().int().nullable(), "@odata.nextLink": z.string().nullable() }).partial().passthrough();
806
784
  const microsoft_graph_sharePointGroupIdentity = z.object({
807
785
  displayName: z.string().describe(
808
786
  "The display name of the identity.For drive items, the display name might not always be available or up to date. For example, if a user changes their display name the API might show the new value in a future response, but the items associated with the user don't show up as changed when using delta."
@@ -883,6 +861,56 @@ const microsoft_graph_permission = z.object({
883
861
  "A unique token that can be used to access this shared item via the shares API. Read-only."
884
862
  ).nullish()
885
863
  }).passthrough();
864
+ const create_upload_session_Body = z.object({ item: z.object({}).partial().passthrough() }).partial().passthrough();
865
+ const microsoft_graph_uploadSession = z.object({
866
+ expirationDateTime: z.string().regex(
867
+ /^[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])$/
868
+ ).datetime({ offset: true }).describe(
869
+ "The date and time in UTC that the upload session expires. The complete file must be uploaded before this expiration time is reached. Each fragment uploaded during the session extends the expiration time."
870
+ ).nullish(),
871
+ nextExpectedRanges: z.array(z.string().nullable()).describe(
872
+ "A collection of byte ranges that the server is missing for the file. These ranges are zero indexed and of the format 'start-end' (for example '0-26' to indicate the first 27 bytes of the file). When uploading files as Outlook attachments, instead of a collection of ranges, this property always indicates a single value '{start}', the location in the file where the next upload should begin."
873
+ ).optional(),
874
+ uploadUrl: z.string().describe("The URL endpoint that accepts PUT requests for byte ranges of the file.").nullish()
875
+ }).passthrough();
876
+ const BaseDeltaFunctionResponse = z.object({ "@odata.nextLink": z.string().nullable(), "@odata.deltaLink": z.string().nullable() }).partial().passthrough();
877
+ const microsoft_graph_sensitivityLabelAssignmentMethod = z.enum([
878
+ "standard",
879
+ "privileged",
880
+ "auto",
881
+ "unknownFutureValue"
882
+ ]);
883
+ const microsoft_graph_sensitivityLabelAssignment = z.object({
884
+ assignmentMethod: microsoft_graph_sensitivityLabelAssignmentMethod.optional(),
885
+ sensitivityLabelId: z.string().describe("The unique identifier for the sensitivity label assigned to the file.").optional(),
886
+ tenantId: z.string().describe(
887
+ "The unique identifier for the tenant that hosts the file when this label is applied."
888
+ ).optional()
889
+ }).passthrough();
890
+ const microsoft_graph_extractSensitivityLabelsResult = z.object({
891
+ labels: z.array(microsoft_graph_sensitivityLabelAssignment).describe("List of sensitivity labels assigned to a file.").optional()
892
+ }).passthrough();
893
+ const share_drive_item_Body = z.object({
894
+ requireSignIn: z.boolean().nullable().default(false),
895
+ roles: z.array(z.string().nullable()),
896
+ sendInvitation: z.boolean().nullable().default(false),
897
+ message: z.string().nullable(),
898
+ recipients: z.array(z.object({}).partial().passthrough()),
899
+ retainInheritedPermissions: z.boolean().nullable().default(false),
900
+ expirationDateTime: z.string().nullable(),
901
+ password: z.string().nullable()
902
+ }).partial().passthrough();
903
+ const BaseCollectionPaginationCountResponse = z.object({ "@odata.count": z.number().int().nullable(), "@odata.nextLink": z.string().nullable() }).partial().passthrough();
904
+ const ReferenceNumeric = z.enum(["-INF", "INF", "NaN"]);
905
+ const create_drive_item_preview_Body = z.object({
906
+ page: z.string().nullable(),
907
+ zoom: z.union([z.number(), z.string(), ReferenceNumeric])
908
+ }).partial().passthrough();
909
+ const microsoft_graph_itemPreviewInfo = z.object({
910
+ getUrl: z.string().nullish(),
911
+ postParameters: z.string().nullish(),
912
+ postUrl: z.string().nullish()
913
+ }).passthrough();
886
914
  const microsoft_graph_permissionCollectionResponse = z.object({
887
915
  "@odata.count": z.number().int().nullable(),
888
916
  "@odata.nextLink": z.string().nullable(),
@@ -3081,7 +3109,6 @@ const microsoft_graph_timeConstraint = z.object({
3081
3109
  activityDomain: microsoft_graph_activityDomain.optional(),
3082
3110
  timeSlots: z.array(microsoft_graph_timeSlot).optional()
3083
3111
  }).passthrough();
3084
- const ReferenceNumeric = z.enum(["-INF", "INF", "NaN"]);
3085
3112
  const find_meeting_times_Body = z.object({
3086
3113
  attendees: z.array(microsoft_graph_attendeeBase),
3087
3114
  locationConstraint: z.union([
@@ -3449,6 +3476,46 @@ const microsoft_graph_callTranscriptCollectionResponse = z.object({
3449
3476
  "@odata.nextLink": z.string().nullable(),
3450
3477
  value: z.array(microsoft_graph_callTranscript)
3451
3478
  }).partial().passthrough();
3479
+ const microsoft_graph_categoryColor = z.enum([
3480
+ "none",
3481
+ "preset0",
3482
+ "preset1",
3483
+ "preset2",
3484
+ "preset3",
3485
+ "preset4",
3486
+ "preset5",
3487
+ "preset6",
3488
+ "preset7",
3489
+ "preset8",
3490
+ "preset9",
3491
+ "preset10",
3492
+ "preset11",
3493
+ "preset12",
3494
+ "preset13",
3495
+ "preset14",
3496
+ "preset15",
3497
+ "preset16",
3498
+ "preset17",
3499
+ "preset18",
3500
+ "preset19",
3501
+ "preset20",
3502
+ "preset21",
3503
+ "preset22",
3504
+ "preset23",
3505
+ "preset24"
3506
+ ]);
3507
+ const microsoft_graph_outlookCategory = z.object({
3508
+ id: z.string().describe("The unique identifier for an entity. Read-only.").optional(),
3509
+ color: microsoft_graph_categoryColor.optional(),
3510
+ displayName: z.string().describe(
3511
+ "A unique name that identifies a category in the user's mailbox. After a category is created, the name cannot be changed. Read-only."
3512
+ ).nullish()
3513
+ }).passthrough();
3514
+ const microsoft_graph_outlookCategoryCollectionResponse = z.object({
3515
+ "@odata.count": z.number().int().nullable(),
3516
+ "@odata.nextLink": z.string().nullable(),
3517
+ value: z.array(microsoft_graph_outlookCategory)
3518
+ }).partial().passthrough();
3452
3519
  const microsoft_graph_personType = z.object({
3453
3520
  class: z.string().describe("The type of data source, such as Person.").nullish(),
3454
3521
  subclass: z.string().describe("The secondary type of data source, such as OrganizationUser.").nullish()
@@ -4478,6 +4545,14 @@ const schemas = {
4478
4545
  microsoft_graph_pendingOperations,
4479
4546
  microsoft_graph_driveItem,
4480
4547
  microsoft_graph_driveItemCollectionResponse,
4548
+ copy_drive_item_Body,
4549
+ create_drive_item_share_link_Body,
4550
+ microsoft_graph_sharePointGroupIdentity,
4551
+ microsoft_graph_sharePointIdentity,
4552
+ microsoft_graph_sharePointIdentitySet,
4553
+ microsoft_graph_sharingInvitation,
4554
+ microsoft_graph_sharingLink,
4555
+ microsoft_graph_permission,
4481
4556
  create_upload_session_Body,
4482
4557
  microsoft_graph_uploadSession,
4483
4558
  BaseDeltaFunctionResponse,
@@ -4486,12 +4561,9 @@ const schemas = {
4486
4561
  microsoft_graph_extractSensitivityLabelsResult,
4487
4562
  share_drive_item_Body,
4488
4563
  BaseCollectionPaginationCountResponse,
4489
- microsoft_graph_sharePointGroupIdentity,
4490
- microsoft_graph_sharePointIdentity,
4491
- microsoft_graph_sharePointIdentitySet,
4492
- microsoft_graph_sharingInvitation,
4493
- microsoft_graph_sharingLink,
4494
- microsoft_graph_permission,
4564
+ ReferenceNumeric,
4565
+ create_drive_item_preview_Body,
4566
+ microsoft_graph_itemPreviewInfo,
4495
4567
  microsoft_graph_permissionCollectionResponse,
4496
4568
  microsoft_graph_publicationFacet,
4497
4569
  microsoft_graph_driveItemVersion,
@@ -4705,7 +4777,6 @@ const schemas = {
4705
4777
  microsoft_graph_locationConstraint,
4706
4778
  microsoft_graph_activityDomain,
4707
4779
  microsoft_graph_timeConstraint,
4708
- ReferenceNumeric,
4709
4780
  find_meeting_times_Body,
4710
4781
  send_mail_Body,
4711
4782
  microsoft_graph_externalLink,
@@ -4741,6 +4812,9 @@ const schemas = {
4741
4812
  microsoft_graph_callRecordingCollectionResponse,
4742
4813
  microsoft_graph_callTranscript,
4743
4814
  microsoft_graph_callTranscriptCollectionResponse,
4815
+ microsoft_graph_categoryColor,
4816
+ microsoft_graph_outlookCategory,
4817
+ microsoft_graph_outlookCategoryCollectionResponse,
4744
4818
  microsoft_graph_personType,
4745
4819
  microsoft_graph_phoneType,
4746
4820
  microsoft_graph_phone,
@@ -5487,6 +5561,39 @@ const endpoints = makeApi([
5487
5561
  ],
5488
5562
  response: z.void()
5489
5563
  },
5564
+ {
5565
+ method: "post",
5566
+ path: "/drives/:driveId/items/:driveItemId/copy",
5567
+ alias: "copy-drive-item",
5568
+ description: `Invoke action copy`,
5569
+ requestFormat: "json",
5570
+ parameters: [
5571
+ {
5572
+ name: "body",
5573
+ description: `Action parameters`,
5574
+ type: "Body",
5575
+ schema: copy_drive_item_Body
5576
+ }
5577
+ ],
5578
+ response: z.void()
5579
+ },
5580
+ {
5581
+ method: "post",
5582
+ path: "/drives/:driveId/items/:driveItemId/createLink",
5583
+ alias: "create-drive-item-share-link",
5584
+ description: `Create a link to share a driveItem driveItem. The createLink action creates a new sharing link if the specified link type doesn't already exist for the calling application.
5585
+ If a sharing link of the specified type already exists for the app, the existing sharing link is returned. DriveItem resources inherit sharing permissions from their ancestors.`,
5586
+ requestFormat: "json",
5587
+ parameters: [
5588
+ {
5589
+ name: "body",
5590
+ description: `Action parameters`,
5591
+ type: "Body",
5592
+ schema: create_drive_item_share_link_Body
5593
+ }
5594
+ ],
5595
+ response: z.void()
5596
+ },
5490
5597
  {
5491
5598
  method: "post",
5492
5599
  path: "/drives/:driveId/items/:driveItemId/createUploadSession",
@@ -5646,6 +5753,22 @@ Items with this property set should be removed from your local state.`,
5646
5753
  ],
5647
5754
  response: z.void()
5648
5755
  },
5756
+ {
5757
+ method: "post",
5758
+ path: "/drives/:driveId/items/:driveItemId/preview",
5759
+ alias: "create-drive-item-preview",
5760
+ description: `Invoke action preview`,
5761
+ requestFormat: "json",
5762
+ parameters: [
5763
+ {
5764
+ name: "body",
5765
+ description: `Action parameters`,
5766
+ type: "Body",
5767
+ schema: create_drive_item_preview_Body
5768
+ }
5769
+ ],
5770
+ response: z.void()
5771
+ },
5649
5772
  {
5650
5773
  method: "get",
5651
5774
  path: "/drives/:driveId/items/:driveItemId/versions",
@@ -8713,6 +8836,66 @@ folder collection and navigate to another folder. By default, this operation doe
8713
8836
  ],
8714
8837
  response: z.void()
8715
8838
  },
8839
+ {
8840
+ method: "get",
8841
+ path: "/me/mailFolders/:mailFolderId/messages/delta()",
8842
+ alias: "list-mail-folder-messages-delta",
8843
+ description: `Get a set of messages added, deleted, or updated in a specified folder. A delta function call for messages in a folder is similar to a GET request, except that by appropriately
8844
+ applying state tokens in one or more of these calls, you can [query for incremental changes in the messages in
8845
+ that folder](/graph/delta-query-messages). It allows you to maintain and synchronize a local store of a user's messages without
8846
+ having to fetch the entire set of messages from the server every time.`,
8847
+ requestFormat: "json",
8848
+ parameters: [
8849
+ {
8850
+ name: "changeType",
8851
+ type: "Query",
8852
+ schema: z.string().describe(
8853
+ "A custom query option to filter the delta response based on the type of change. Supported values are created, updated or deleted."
8854
+ ).optional()
8855
+ },
8856
+ {
8857
+ name: "$top",
8858
+ type: "Query",
8859
+ schema: z.number().int().gte(0).describe("Show only the first n items").optional()
8860
+ },
8861
+ {
8862
+ name: "$skip",
8863
+ type: "Query",
8864
+ schema: z.number().int().gte(0).describe("Skip the first n items").optional()
8865
+ },
8866
+ {
8867
+ name: "$search",
8868
+ type: "Query",
8869
+ schema: z.string().describe("Search items by search phrases").optional()
8870
+ },
8871
+ {
8872
+ name: "$filter",
8873
+ type: "Query",
8874
+ schema: z.string().describe("Filter items by property values").optional()
8875
+ },
8876
+ {
8877
+ name: "$count",
8878
+ type: "Query",
8879
+ schema: z.boolean().describe("Include count of items").optional()
8880
+ },
8881
+ {
8882
+ name: "$select",
8883
+ type: "Query",
8884
+ schema: z.array(z.string()).describe("Select properties to be returned").optional()
8885
+ },
8886
+ {
8887
+ name: "$orderby",
8888
+ type: "Query",
8889
+ schema: z.array(z.string()).describe("Order items by property values").optional()
8890
+ },
8891
+ {
8892
+ name: "$expand",
8893
+ type: "Query",
8894
+ schema: z.array(z.string()).describe("Expand related entities").optional()
8895
+ }
8896
+ ],
8897
+ response: z.void()
8898
+ },
8716
8899
  {
8717
8900
  method: "get",
8718
8901
  path: "/me/manager",
@@ -9129,6 +9312,22 @@ resource.`,
9129
9312
  ],
9130
9313
  response: z.void()
9131
9314
  },
9315
+ {
9316
+ method: "post",
9317
+ path: "/me/messages/:messageId/copy",
9318
+ alias: "copy-mail-message",
9319
+ description: `Copy a message to a folder within the user's mailbox.`,
9320
+ requestFormat: "json",
9321
+ parameters: [
9322
+ {
9323
+ name: "body",
9324
+ description: `Action parameters`,
9325
+ type: "Body",
9326
+ schema: z.object({ DestinationId: z.string() }).partial().passthrough()
9327
+ }
9328
+ ],
9329
+ response: z.void()
9330
+ },
9132
9331
  {
9133
9332
  method: "post",
9134
9333
  path: "/me/messages/:messageId/createForward",
@@ -10023,6 +10222,72 @@ resource.`,
10023
10222
  requestFormat: "json",
10024
10223
  response: z.void()
10025
10224
  },
10225
+ {
10226
+ method: "get",
10227
+ path: "/me/outlook/masterCategories",
10228
+ alias: "list-outlook-categories",
10229
+ description: `Get all the categories that have been defined for a user.`,
10230
+ requestFormat: "json",
10231
+ parameters: [
10232
+ {
10233
+ name: "$top",
10234
+ type: "Query",
10235
+ schema: z.number().int().gte(0).describe("Show only the first n items").optional()
10236
+ },
10237
+ {
10238
+ name: "$skip",
10239
+ type: "Query",
10240
+ schema: z.number().int().gte(0).describe("Skip the first n items").optional()
10241
+ },
10242
+ {
10243
+ name: "$search",
10244
+ type: "Query",
10245
+ schema: z.string().describe("Search items by search phrases").optional()
10246
+ },
10247
+ {
10248
+ name: "$filter",
10249
+ type: "Query",
10250
+ schema: z.string().describe("Filter items by property values").optional()
10251
+ },
10252
+ {
10253
+ name: "$count",
10254
+ type: "Query",
10255
+ schema: z.boolean().describe("Include count of items").optional()
10256
+ },
10257
+ {
10258
+ name: "$orderby",
10259
+ type: "Query",
10260
+ schema: z.array(z.string()).describe("Order items by property values").optional()
10261
+ },
10262
+ {
10263
+ name: "$select",
10264
+ type: "Query",
10265
+ schema: z.array(z.string()).describe("Select properties to be returned").optional()
10266
+ },
10267
+ {
10268
+ name: "$expand",
10269
+ type: "Query",
10270
+ schema: z.array(z.string()).describe("Expand related entities").optional()
10271
+ }
10272
+ ],
10273
+ response: z.void()
10274
+ },
10275
+ {
10276
+ method: "post",
10277
+ path: "/me/outlook/masterCategories",
10278
+ alias: "create-outlook-category",
10279
+ description: `Create an outlookCategory object in the user's master list of categories.`,
10280
+ requestFormat: "json",
10281
+ parameters: [
10282
+ {
10283
+ name: "body",
10284
+ description: `New navigation property`,
10285
+ type: "Body",
10286
+ schema: microsoft_graph_outlookCategory
10287
+ }
10288
+ ],
10289
+ response: z.void()
10290
+ },
10026
10291
  {
10027
10292
  method: "get",
10028
10293
  path: "/me/people",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@softeria/ms-365-mcp-server",
3
- "version": "0.89.0",
3
+ "version": "0.91.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",
@@ -500,6 +500,27 @@
500
500
  "scopes": ["Files.ReadWrite"],
501
501
  "llmTip": "Shares a file or folder with specific users. Body: { recipients: [{ email: 'user@example.com' }], roles: ['read'], sendInvitation: true, message: 'Please review this file.' }. Roles: 'read', 'write', 'owner'. Set requireSignIn to true to require authentication."
502
502
  },
503
+ {
504
+ "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/createLink",
505
+ "method": "post",
506
+ "toolName": "create-drive-item-share-link",
507
+ "scopes": ["Files.ReadWrite"],
508
+ "llmTip": "Create a shareable link for a file or folder WITHOUT sending an email invitation. Body: { type: 'view' | 'edit' | 'embed', scope: 'anonymous' | 'organization' | 'users', password?: string, expirationDateTime?: ISO-8601, retainInheritedPermissions?: boolean }. Returns a permission with link.webUrl. Pair with share-drive-item when you want to grant explicit access; use this when you only need a URL to paste into a doc/email/chat without triggering OneDrive notifications."
509
+ },
510
+ {
511
+ "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/copy",
512
+ "method": "post",
513
+ "toolName": "copy-drive-item",
514
+ "scopes": ["Files.ReadWrite"],
515
+ "llmTip": "Asynchronously copy a file or folder to a new location and/or name. Body: { parentReference: { driveId: '...', id: '...' }, name?: 'New Name.xlsx' }. Returns 202 Accepted with a Location header pointing at a monitor URL for the async job. Ideal for duplicating templates (e.g. clone an Armhr Census Template per prospect), bulk file provisioning, or preserving an immutable snapshot of a working file."
516
+ },
517
+ {
518
+ "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/preview",
519
+ "method": "post",
520
+ "toolName": "create-drive-item-preview",
521
+ "scopes": ["Files.Read"],
522
+ "llmTip": "Generate a short-lived embeddable preview URL for a file (Office docs, PDFs, images). Body: { page?: number | string, zoom?: number, viewer?: 'onedrive' | 'office' }. Returns getUrl (interactive) and postUrl (form-post). Useful for surfacing inline previews in summary emails or chat messages without needing the recipient to open the file."
523
+ },
503
524
  {
504
525
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/permissions",
505
526
  "method": "get",
@@ -1736,5 +1757,33 @@
1736
1757
  "toolName": "get-sensitivity-label",
1737
1758
  "workScopes": ["SensitivityLabel.Read"],
1738
1759
  "llmTip": "Gets a single MIP sensitivity label by id. Use list-sensitivity-labels to find ids. Not supported for personal Microsoft accounts."
1760
+ },
1761
+ {
1762
+ "pathPattern": "/me/messages/{message-id}/copy",
1763
+ "method": "post",
1764
+ "toolName": "copy-mail-message",
1765
+ "scopes": ["Mail.ReadWrite"],
1766
+ "llmTip": "Copies a message to another mail folder. Body: { DestinationId: '<mailFolder-id or well-known name like inbox, archive, junkemail>' }. Returns the newly created message (with a new id) in the destination folder. For moving instead of copying, use move-mail-message."
1767
+ },
1768
+ {
1769
+ "pathPattern": "/me/mailFolders/{mailFolder-id}/messages/delta()",
1770
+ "method": "get",
1771
+ "toolName": "list-mail-folder-messages-delta",
1772
+ "scopes": ["Mail.Read"],
1773
+ "llmTip": "Incremental sync of messages within a mail folder. Graph only supports delta scoped to a folder — use mailFolder-id = 'inbox' for the well-known inbox, or another folder id from list-mail-folders. First call returns all messages plus @odata.deltaLink; subsequent calls with that link return only changes (created/updated/deleted). @odata.nextLink paginates within a single delta window. Deltas expire after ~30 days of inactivity — start over if the server returns 410. Prefer this over full re-list for polling."
1774
+ },
1775
+ {
1776
+ "pathPattern": "/me/outlook/masterCategories",
1777
+ "method": "get",
1778
+ "toolName": "list-outlook-categories",
1779
+ "scopes": ["MailboxSettings.Read"],
1780
+ "llmTip": "Lists the user's Outlook categories (colored labels) used to tag messages, events, contacts, and tasks. Each category has displayName and color (preset0 through preset24, or 'none'). Use this to show available tags before applying via update-mail-message or update-calendar-event with body { categories: ['Category Name'] }."
1781
+ },
1782
+ {
1783
+ "pathPattern": "/me/outlook/masterCategories",
1784
+ "method": "post",
1785
+ "toolName": "create-outlook-category",
1786
+ "scopes": ["MailboxSettings.ReadWrite"],
1787
+ "llmTip": "Creates a new Outlook category. Body: { displayName (unique), color (one of: none, preset0 … preset24 — maps to red, orange, yellow, green, teal, olive, blue, purple, cranberry, steel, dark-steel, gray, dark-gray, black, dark-red, dark-orange, dark-yellow, dark-green, dark-teal, dark-olive, dark-blue, dark-purple, dark-cranberry) }. Category names are case-sensitive when applied to messages/events."
1739
1788
  }
1740
1789
  ]