@softeria/ms-365-mcp-server 0.44.0 → 0.45.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.
package/README.md CHANGED
@@ -133,11 +133,14 @@ delete-outlook-contact</sub>
133
133
 
134
134
  ### Organization Account Tools (Requires --org-mode flag)
135
135
 
136
- **Teams & Chats**
136
+ **Teams & Chats**
137
137
  <sub>list-chats, get-chat, list-chat-messages, get-chat-message, send-chat-message, list-chat-message-replies,
138
138
  reply-to-chat-message, list-joined-teams, get-team, list-team-channels, get-team-channel, list-channel-messages,
139
139
  get-channel-message, send-channel-message, list-team-members</sub>
140
140
 
141
+ **Online Meetings & Transcripts**
142
+ <sub>list-online-meetings, list-meeting-transcripts, get-meeting-transcript-content</sub>
143
+
141
144
  **SharePoint Sites**
142
145
  <sub>search-sharepoint-sites, get-sharepoint-site, get-sharepoint-site-by-path, list-sharepoint-site-drives,
143
146
  get-sharepoint-site-drive-by-id, list-sharepoint-site-items, get-sharepoint-site-item, list-sharepoint-site-lists,
@@ -689,6 +689,31 @@
689
689
  "scopes": ["Mail.Read", "Calendars.Read", "Files.Read.All", "People.Read"],
690
690
  "workScopes": ["Sites.Read.All", "Chat.Read", "ChannelMessage.Read.All"]
691
691
  },
692
+ {
693
+ "pathPattern": "/me/onlineMeetings",
694
+ "method": "get",
695
+ "toolName": "list-online-meetings",
696
+ "scopes": ["OnlineMeetings.Read"],
697
+ "workScopes": ["OnlineMeetings.Read"],
698
+ "llmTip": "List online meetings. Use $filter=joinWebUrl eq '{url}' to find a specific meeting by its Teams join link. Returns meeting IDs needed for transcript access."
699
+ },
700
+ {
701
+ "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}/transcripts",
702
+ "method": "get",
703
+ "toolName": "list-meeting-transcripts",
704
+ "scopes": ["OnlineMeetingTranscript.Read.All"],
705
+ "workScopes": ["OnlineMeetingTranscript.Read.All"],
706
+ "llmTip": "Lists available transcripts for a meeting. Get the meeting ID first via list-online-meetings."
707
+ },
708
+ {
709
+ "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}/transcripts/{callTranscript-id}/content",
710
+ "method": "get",
711
+ "toolName": "get-meeting-transcript-content",
712
+ "scopes": ["OnlineMeetingTranscript.Read.All"],
713
+ "workScopes": ["OnlineMeetingTranscript.Read.All"],
714
+ "acceptType": "text/vtt",
715
+ "llmTip": "Returns the transcript content in WebVTT format with speaker identification and timestamps."
716
+ },
692
717
  {
693
718
  "pathPattern": "/groups/{group-id}/conversations",
694
719
  "method": "get",
@@ -2360,7 +2360,7 @@ const microsoft_graph_team = z.lazy(
2360
2360
  ).nullish(),
2361
2361
  allChannels: z.array(microsoft_graph_channel).describe("List of channels either hosted in or shared with the team (incoming channels).").optional(),
2362
2362
  channels: z.array(microsoft_graph_channel).describe("The collection of channels and messages associated with the team.").optional(),
2363
- group: microsoft_graph_group.describe("[Note: Simplified from 73 properties to 25 most common ones]").optional(),
2363
+ group: microsoft_graph_group.describe("[Note: Simplified from 74 properties to 25 most common ones]").optional(),
2364
2364
  incomingChannels: z.array(microsoft_graph_channel).describe("List of channels shared with the team.").optional(),
2365
2365
  installedApps: z.array(microsoft_graph_teamsAppInstallation).describe("The apps installed in this team.").optional(),
2366
2366
  members: z.array(microsoft_graph_conversationMember).describe("Members and owners of the team.").optional(),
@@ -2787,6 +2787,121 @@ const microsoft_graph_onenotePageCollectionResponse = z.object({
2787
2787
  "@odata.nextLink": z.string().nullable(),
2788
2788
  value: z.array(microsoft_graph_onenotePage)
2789
2789
  }).partial().passthrough();
2790
+ const microsoft_graph_allowedLobbyAdmitterRoles = z.enum([
2791
+ "organizerAndCoOrganizersAndPresenters",
2792
+ "organizerAndCoOrganizers",
2793
+ "unknownFutureValue"
2794
+ ]);
2795
+ const microsoft_graph_onlineMeetingPresenters = z.enum([
2796
+ "everyone",
2797
+ "organization",
2798
+ "roleIsPresenter",
2799
+ "organizer",
2800
+ "unknownFutureValue"
2801
+ ]);
2802
+ const microsoft_graph_meetingLiveShareOptions = z.enum([
2803
+ "enabled",
2804
+ "disabled",
2805
+ "unknownFutureValue"
2806
+ ]);
2807
+ const microsoft_graph_meetingChatMode = z.enum([
2808
+ "enabled",
2809
+ "disabled",
2810
+ "limited",
2811
+ "unknownFutureValue"
2812
+ ]);
2813
+ const microsoft_graph_audioConferencing = z.object({
2814
+ conferenceId: z.string().describe("The conference id of the online meeting.").nullish(),
2815
+ dialinUrl: z.string().describe("A URL to the externally-accessible web page that contains dial-in information.").nullish(),
2816
+ tollFreeNumber: z.string().describe("The toll-free number that connects to the Audio Conference Provider.").nullish(),
2817
+ tollFreeNumbers: z.array(z.string().nullable()).describe("List of toll-free numbers that are displayed in the meeting invite.").optional(),
2818
+ tollNumber: z.string().describe("The toll number that connects to the Audio Conference Provider.").nullish(),
2819
+ tollNumbers: z.array(z.string().nullable()).describe("List of toll numbers that are displayed in the meeting invite.").optional()
2820
+ }).passthrough();
2821
+ const microsoft_graph_chatInfo = z.object({
2822
+ messageId: z.string().describe("The unique identifier of a message in a Microsoft Teams channel.").nullish(),
2823
+ replyChainMessageId: z.string().describe("The ID of the reply message.").nullish(),
2824
+ threadId: z.string().describe("The unique identifier for a thread in Microsoft Teams.").nullish()
2825
+ }).passthrough();
2826
+ const microsoft_graph_chatRestrictions = z.object({
2827
+ allowTextOnly: z.boolean().describe("Indicates whether only text is allowed in the meeting chat. Optional.").nullish()
2828
+ }).passthrough();
2829
+ const microsoft_graph_joinMeetingIdSettings = z.object({
2830
+ isPasscodeRequired: z.boolean().describe(
2831
+ "Indicates whether a passcode is required to join a meeting when using joinMeetingId. Optional."
2832
+ ).nullish(),
2833
+ joinMeetingId: z.string().describe("The meeting ID to be used to join a meeting. Optional. Read-only.").nullish(),
2834
+ passcode: z.string().describe("The passcode to join a meeting. Optional. Read-only.").nullish()
2835
+ }).passthrough();
2836
+ const microsoft_graph_onlineMeeting = z.object({
2837
+ id: z.string().describe("The unique identifier for an entity. Read-only.").optional(),
2838
+ subject: z.string().describe("The subject of the online meeting.").nullish(),
2839
+ allowAttendeeToEnableCamera: z.boolean().describe("Indicates whether attendees can turn on their camera.").nullish(),
2840
+ allowAttendeeToEnableMic: z.boolean().describe("Indicates whether attendees can turn on their microphone.").nullish(),
2841
+ allowBreakoutRooms: z.boolean().describe("Indicates whether breakout rooms are enabled for the meeting.").nullish(),
2842
+ allowCopyingAndSharingMeetingContent: z.boolean().describe(
2843
+ "Indicates whether the ability to copy and share meeting content is enabled for the meeting."
2844
+ ).nullish(),
2845
+ allowedLobbyAdmitters: microsoft_graph_allowedLobbyAdmitterRoles.optional(),
2846
+ allowedPresenters: microsoft_graph_onlineMeetingPresenters.optional(),
2847
+ allowLiveShare: microsoft_graph_meetingLiveShareOptions.optional(),
2848
+ allowMeetingChat: microsoft_graph_meetingChatMode.optional(),
2849
+ allowParticipantsToChangeName: z.boolean().describe(
2850
+ "Specifies if participants are allowed to rename themselves in an instance of the meeting."
2851
+ ).nullish(),
2852
+ allowPowerPointSharing: z.boolean().describe("Indicates whether PowerPoint live is enabled for the meeting.").nullish(),
2853
+ allowRecording: z.boolean().describe("Indicates whether recording is enabled for the meeting.").nullish(),
2854
+ allowTeamworkReactions: z.boolean().describe("Indicates if Teams reactions are enabled for the meeting.").nullish(),
2855
+ allowTranscription: z.boolean().describe("Indicates whether transcription is enabled for the meeting.").nullish(),
2856
+ allowWhiteboard: z.boolean().describe("Indicates whether whiteboard is enabled for the meeting.").nullish(),
2857
+ audioConferencing: microsoft_graph_audioConferencing.optional(),
2858
+ chatInfo: microsoft_graph_chatInfo.optional(),
2859
+ chatRestrictions: microsoft_graph_chatRestrictions.optional(),
2860
+ expiryDateTime: z.string().regex(
2861
+ /^[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])$/
2862
+ ).datetime({ offset: true }).describe(
2863
+ "Indicates the date and time when the meeting resource expires. The timestamp type represents date and time information using ISO 8601 format and is always in UTC. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z."
2864
+ ).nullish(),
2865
+ isEndToEndEncryptionEnabled: z.boolean().describe("Indicates whether end-to-end encryption (E2EE) is enabled for the online meeting.").nullish(),
2866
+ isEntryExitAnnounced: z.boolean().describe("Indicates whether to announce when callers join or leave.").nullish(),
2867
+ joinInformation: microsoft_graph_itemBody.optional(),
2868
+ joinMeetingIdSettings: microsoft_graph_joinMeetingIdSettings.optional(),
2869
+ joinWebUrl: z.string().describe("The join URL of the online meeting. Read-only.").nullish()
2870
+ }).passthrough().passthrough();
2871
+ const microsoft_graph_onlineMeetingCollectionResponse = z.object({
2872
+ "@odata.count": z.number().int().nullable(),
2873
+ "@odata.nextLink": z.string().nullable(),
2874
+ value: z.array(microsoft_graph_onlineMeeting)
2875
+ }).partial().passthrough();
2876
+ const microsoft_graph_callTranscript = z.object({
2877
+ id: z.string().describe("The unique identifier for an entity. Read-only.").optional(),
2878
+ callId: z.string().describe("The unique identifier for the call that is related to this transcript. Read-only.").nullish(),
2879
+ content: z.string().describe("The content of the transcript. Read-only.").nullish(),
2880
+ contentCorrelationId: z.string().describe(
2881
+ "The unique identifier that links the transcript with its corresponding recording. Read-only."
2882
+ ).nullish(),
2883
+ createdDateTime: z.string().regex(
2884
+ /^[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])$/
2885
+ ).datetime({ offset: true }).describe(
2886
+ "Date and time at which the transcript was created. The timestamp type represents date and time information using ISO 8601 format and is always in UTC. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z. Read-only."
2887
+ ).nullish(),
2888
+ endDateTime: z.string().regex(
2889
+ /^[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])$/
2890
+ ).datetime({ offset: true }).describe(
2891
+ "Date and time at which the transcription ends. The timestamp type represents date and time information using ISO 8601 format and is always in UTC. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z. Read-only."
2892
+ ).nullish(),
2893
+ meetingId: z.string().describe(
2894
+ "The unique identifier of the online meeting related to this transcript. Read-only."
2895
+ ).nullish(),
2896
+ meetingOrganizer: microsoft_graph_identitySet.optional(),
2897
+ metadataContent: z.string().describe("The time-aligned metadata of the utterances in the transcript. Read-only.").nullish(),
2898
+ transcriptContentUrl: z.string().describe("The URL that can be used to access the content of the transcript. Read-only.").nullish()
2899
+ }).passthrough();
2900
+ const microsoft_graph_callTranscriptCollectionResponse = z.object({
2901
+ "@odata.count": z.number().int().nullable(),
2902
+ "@odata.nextLink": z.string().nullable(),
2903
+ value: z.array(microsoft_graph_callTranscript)
2904
+ }).partial().passthrough();
2790
2905
  const microsoft_graph_plannerChecklistItems = z.object({}).passthrough();
2791
2906
  const microsoft_graph_plannerPreviewType = z.enum([
2792
2907
  "automatic",
@@ -3627,6 +3742,18 @@ const schemas = {
3627
3742
  microsoft_graph_notebookCollectionResponse,
3628
3743
  microsoft_graph_onenoteSectionCollectionResponse,
3629
3744
  microsoft_graph_onenotePageCollectionResponse,
3745
+ microsoft_graph_allowedLobbyAdmitterRoles,
3746
+ microsoft_graph_onlineMeetingPresenters,
3747
+ microsoft_graph_meetingLiveShareOptions,
3748
+ microsoft_graph_meetingChatMode,
3749
+ microsoft_graph_audioConferencing,
3750
+ microsoft_graph_chatInfo,
3751
+ microsoft_graph_chatRestrictions,
3752
+ microsoft_graph_joinMeetingIdSettings,
3753
+ microsoft_graph_onlineMeeting,
3754
+ microsoft_graph_onlineMeetingCollectionResponse,
3755
+ microsoft_graph_callTranscript,
3756
+ microsoft_graph_callTranscriptCollectionResponse,
3630
3757
  microsoft_graph_plannerChecklistItems,
3631
3758
  microsoft_graph_plannerPreviewType,
3632
3759
  microsoft_graph_plannerExternalReferences,
@@ -6114,6 +6241,114 @@ resource.`,
6114
6241
  ],
6115
6242
  response: z.void()
6116
6243
  },
6244
+ {
6245
+ method: "get",
6246
+ path: "/me/onlineMeetings",
6247
+ alias: "list-online-meetings",
6248
+ description: `Retrieve the properties and relationships of an onlineMeeting object. For example, you can: Teams live event attendee report (deprecated) and Teams live event recordings (deprecated) are online meeting artifacts. For more information, see Online meeting artifacts and permissions.`,
6249
+ requestFormat: "json",
6250
+ parameters: [
6251
+ {
6252
+ name: "$top",
6253
+ type: "Query",
6254
+ schema: z.number().int().gte(0).describe("Show only the first n items").optional()
6255
+ },
6256
+ {
6257
+ name: "$skip",
6258
+ type: "Query",
6259
+ schema: z.number().int().gte(0).describe("Skip the first n items").optional()
6260
+ },
6261
+ {
6262
+ name: "$search",
6263
+ type: "Query",
6264
+ schema: z.string().describe("Search items by search phrases").optional()
6265
+ },
6266
+ {
6267
+ name: "$filter",
6268
+ type: "Query",
6269
+ schema: z.string().describe("Filter items by property values").optional()
6270
+ },
6271
+ {
6272
+ name: "$count",
6273
+ type: "Query",
6274
+ schema: z.boolean().describe("Include count of items").optional()
6275
+ },
6276
+ {
6277
+ name: "$orderby",
6278
+ type: "Query",
6279
+ schema: z.array(z.string()).describe("Order items by property values").optional()
6280
+ },
6281
+ {
6282
+ name: "$select",
6283
+ type: "Query",
6284
+ schema: z.array(z.string()).describe("Select properties to be returned").optional()
6285
+ },
6286
+ {
6287
+ name: "$expand",
6288
+ type: "Query",
6289
+ schema: z.array(z.string()).describe("Expand related entities").optional()
6290
+ }
6291
+ ],
6292
+ response: z.void()
6293
+ },
6294
+ {
6295
+ method: "get",
6296
+ path: "/me/onlineMeetings/:onlineMeetingId/transcripts",
6297
+ alias: "list-meeting-transcripts",
6298
+ description: `The transcripts of an online meeting. Read-only.`,
6299
+ requestFormat: "json",
6300
+ parameters: [
6301
+ {
6302
+ name: "$top",
6303
+ type: "Query",
6304
+ schema: z.number().int().gte(0).describe("Show only the first n items").optional()
6305
+ },
6306
+ {
6307
+ name: "$skip",
6308
+ type: "Query",
6309
+ schema: z.number().int().gte(0).describe("Skip the first n items").optional()
6310
+ },
6311
+ {
6312
+ name: "$search",
6313
+ type: "Query",
6314
+ schema: z.string().describe("Search items by search phrases").optional()
6315
+ },
6316
+ {
6317
+ name: "$filter",
6318
+ type: "Query",
6319
+ schema: z.string().describe("Filter items by property values").optional()
6320
+ },
6321
+ {
6322
+ name: "$count",
6323
+ type: "Query",
6324
+ schema: z.boolean().describe("Include count of items").optional()
6325
+ },
6326
+ {
6327
+ name: "$orderby",
6328
+ type: "Query",
6329
+ schema: z.array(z.string()).describe("Order items by property values").optional()
6330
+ },
6331
+ {
6332
+ name: "$select",
6333
+ type: "Query",
6334
+ schema: z.array(z.string()).describe("Select properties to be returned").optional()
6335
+ },
6336
+ {
6337
+ name: "$expand",
6338
+ type: "Query",
6339
+ schema: z.array(z.string()).describe("Expand related entities").optional()
6340
+ }
6341
+ ],
6342
+ response: z.void()
6343
+ },
6344
+ {
6345
+ method: "get",
6346
+ path: "/me/onlineMeetings/:onlineMeetingId/transcripts/:callTranscriptId/content",
6347
+ alias: "get-meeting-transcript-content",
6348
+ description: `The content of the transcript. Read-only.`,
6349
+ requestFormat: "json",
6350
+ response: z.void()
6351
+ },
6117
6352
  {
6118
6353
  method: "get",
6119
6354
  path: "/me/planner/tasks",
@@ -5,6 +5,7 @@ import { readFileSync } from "fs";
5
5
  import path from "path";
6
6
  import { fileURLToPath } from "url";
7
7
  import { TOOL_CATEGORIES } from "./tool-categories.js";
8
+ import { getRequestTokens } from "./request-context.js";
8
9
  const __filename = fileURLToPath(import.meta.url);
9
10
  const __dirname = path.dirname(__filename);
10
11
  const endpointsData = JSON.parse(
@@ -14,7 +15,7 @@ async function executeGraphTool(tool, config, graphClient, params, authManager)
14
15
  logger.info(`Tool ${tool.alias} called with params: ${JSON.stringify(params)}`);
15
16
  try {
16
17
  let accountAccessToken;
17
- if (authManager && !authManager.isOAuthModeEnabled()) {
18
+ if (authManager && !authManager.isOAuthModeEnabled() && !getRequestTokens()) {
18
19
  const accountParam = params.account;
19
20
  try {
20
21
  accountAccessToken = await authManager.getTokenForAccount(accountParam);
@@ -131,6 +132,10 @@ async function executeGraphTool(tool, config, graphClient, params, authManager)
131
132
  headers["Content-Type"] = config.contentType;
132
133
  logger.info(`Setting custom Content-Type: ${config.contentType}`);
133
134
  }
135
+ if (config?.acceptType) {
136
+ headers["Accept"] = config.acceptType;
137
+ logger.info(`Setting custom Accept: ${config.acceptType}`);
138
+ }
134
139
  if (Object.keys(queryParams).length > 0) {
135
140
  const queryString = Object.entries(queryParams).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`).join("&");
136
141
  path2 = `${path2}${path2.includes("?") ? "&" : "?"}${queryString}`;
@@ -1,10 +1,10 @@
1
- 2026-03-03 14:05:54 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me
2
- 2026-03-03 14:05:54 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me
3
- 2026-03-03 14:05:54 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me
4
- 2026-03-03 14:05:54 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me/messages
5
- 2026-03-03 14:05:54 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me/calendar
6
- 2026-03-03 14:05:55 INFO: Using environment variables for secrets
7
- 2026-03-03 14:05:55 INFO: Using environment variables for secrets
8
- 2026-03-03 14:05:55 INFO: Using environment variables for secrets
9
- 2026-03-03 14:05:55 INFO: Using environment variables for secrets
10
- 2026-03-03 14:05:55 INFO: Using environment variables for secrets
1
+ 2026-03-09 08:13:53 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me
2
+ 2026-03-09 08:13:53 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me
3
+ 2026-03-09 08:13:53 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me
4
+ 2026-03-09 08:13:53 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me/messages
5
+ 2026-03-09 08:13:53 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me/calendar
6
+ 2026-03-09 08:13:54 INFO: Using environment variables for secrets
7
+ 2026-03-09 08:13:54 INFO: Using environment variables for secrets
8
+ 2026-03-09 08:13:54 INFO: Using environment variables for secrets
9
+ 2026-03-09 08:13:54 INFO: Using environment variables for secrets
10
+ 2026-03-09 08:13:54 INFO: Using environment variables for secrets
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@softeria/ms-365-mcp-server",
3
- "version": "0.44.0",
3
+ "version": "0.45.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",
@@ -689,6 +689,31 @@
689
689
  "scopes": ["Mail.Read", "Calendars.Read", "Files.Read.All", "People.Read"],
690
690
  "workScopes": ["Sites.Read.All", "Chat.Read", "ChannelMessage.Read.All"]
691
691
  },
692
+ {
693
+ "pathPattern": "/me/onlineMeetings",
694
+ "method": "get",
695
+ "toolName": "list-online-meetings",
696
+ "scopes": ["OnlineMeetings.Read"],
697
+ "workScopes": ["OnlineMeetings.Read"],
698
+ "llmTip": "List online meetings. Use $filter=joinWebUrl eq '{url}' to find a specific meeting by its Teams join link. Returns meeting IDs needed for transcript access."
699
+ },
700
+ {
701
+ "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}/transcripts",
702
+ "method": "get",
703
+ "toolName": "list-meeting-transcripts",
704
+ "scopes": ["OnlineMeetingTranscript.Read.All"],
705
+ "workScopes": ["OnlineMeetingTranscript.Read.All"],
706
+ "llmTip": "Lists available transcripts for a meeting. Get the meeting ID first via list-online-meetings."
707
+ },
708
+ {
709
+ "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}/transcripts/{callTranscript-id}/content",
710
+ "method": "get",
711
+ "toolName": "get-meeting-transcript-content",
712
+ "scopes": ["OnlineMeetingTranscript.Read.All"],
713
+ "workScopes": ["OnlineMeetingTranscript.Read.All"],
714
+ "acceptType": "text/vtt",
715
+ "llmTip": "Returns the transcript content in WebVTT format with speaker identification and timestamps."
716
+ },
692
717
  {
693
718
  "pathPattern": "/groups/{group-id}/conversations",
694
719
  "method": "get",