@softeria/ms-365-mcp-server 0.95.0 → 0.96.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/bin/modules/simplified-openapi.mjs +14 -4
- package/dist/endpoints.json +54 -2
- package/dist/generated/client.js +159 -18
- package/package.json +1 -1
- package/src/endpoints.json +54 -2
|
@@ -8,24 +8,34 @@ export function createAndSaveSimplifiedOpenAPI(endpointsFile, openapiFile, opena
|
|
|
8
8
|
const spec = fs.readFileSync(openapiFile, 'utf8');
|
|
9
9
|
const openApiSpec = yaml.load(spec);
|
|
10
10
|
|
|
11
|
+
// Synthesize paths that the Graph REST API supports but are missing from
|
|
12
|
+
// Microsoft's published OpenAPI metadata (e.g. range(address='{address}')/format
|
|
13
|
+
// — documented in Excel API but not in the OpenAPI spec).
|
|
11
14
|
for (const endpoint of endpoints) {
|
|
12
15
|
if (!openApiSpec.paths[endpoint.pathPattern]) {
|
|
13
|
-
|
|
16
|
+
openApiSpec.paths[endpoint.pathPattern] = {};
|
|
14
17
|
}
|
|
15
18
|
}
|
|
16
19
|
|
|
17
|
-
// Synthesize operations
|
|
18
|
-
// Microsoft's published OpenAPI metadata (e.g. PATCH on range(address='{address}')
|
|
19
|
-
// for cell-value writes — documented in Excel API but not in the OpenAPI spec).
|
|
20
|
+
// Synthesize operations on existing paths when the method is missing.
|
|
20
21
|
for (const endpoint of endpoints) {
|
|
21
22
|
const pathSpec = openApiSpec.paths[endpoint.pathPattern];
|
|
22
23
|
const methodLower = endpoint.method.toLowerCase();
|
|
23
24
|
if (pathSpec && !pathSpec[methodLower]) {
|
|
25
|
+
const pathParamMatches = [...endpoint.pathPattern.matchAll(/\{([^}]+)\}/g)].map((m) => m[1]);
|
|
26
|
+
const synthesizedParameters = pathParamMatches.map((paramName) => ({
|
|
27
|
+
name: paramName,
|
|
28
|
+
in: 'path',
|
|
29
|
+
required: true,
|
|
30
|
+
description: `Path parameter: ${paramName}`,
|
|
31
|
+
schema: { type: 'string' },
|
|
32
|
+
}));
|
|
24
33
|
pathSpec[methodLower] = {
|
|
25
34
|
tags: ['drives.driveItem'],
|
|
26
35
|
summary: endpoint.llmTip || `${endpoint.toolName} (synthesized)`,
|
|
27
36
|
description: endpoint.llmTip || `${endpoint.toolName} (synthesized)`,
|
|
28
37
|
operationId: endpoint.toolName,
|
|
38
|
+
parameters: synthesizedParameters,
|
|
29
39
|
requestBody:
|
|
30
40
|
methodLower === 'get' || methodLower === 'delete'
|
|
31
41
|
? undefined
|
package/dist/endpoints.json
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"pathPattern": "/$batch",
|
|
4
|
+
"method": "post",
|
|
5
|
+
"toolName": "graph-batch",
|
|
6
|
+
"scopes": [],
|
|
7
|
+
"llmTip": "Combine up to 20 Graph requests into a single HTTP call. Body: { requests: [{ id: '1', method: 'GET'|'POST'|'PATCH'|'DELETE', url: '/me/messages?$top=5', headers?: {...}, body?: {...}, dependsOn?: ['1'] }, ...] }. Returns { responses: [{ id, status, body, headers }] } in arbitrary order — match by id. Use cases: (1) parallelize many small reads (e.g. fetch 15 mail messages by id in one round-trip); (2) sequence dependent writes via dependsOn; (3) batch many Excel range writes into one call to dramatically reduce latency on large workbook builds. Note: each sub-request URL is relative to the Graph version root (/me/..., /drives/..., NOT https://graph.microsoft.com/v1.0/...)."
|
|
8
|
+
},
|
|
2
9
|
{
|
|
3
10
|
"pathPattern": "/me/messages",
|
|
4
11
|
"method": "get",
|
|
@@ -593,11 +600,13 @@
|
|
|
593
600
|
"scopes": ["Files.ReadWrite"]
|
|
594
601
|
},
|
|
595
602
|
{
|
|
596
|
-
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range()/format",
|
|
603
|
+
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')/format",
|
|
597
604
|
"method": "patch",
|
|
598
605
|
"toolName": "format-excel-range",
|
|
599
606
|
"isExcelOp": true,
|
|
600
|
-
"scopes": ["Files.ReadWrite"]
|
|
607
|
+
"scopes": ["Files.ReadWrite"],
|
|
608
|
+
"skipEncoding": ["address"],
|
|
609
|
+
"llmTip": "Apply font/fill/borders/alignment/wrapText/columnWidth/rowHeight to a specific range. Required path param 'address' (e.g. 'A1:E5' or 'Sheet1!A1:E5'). Body: { font: {bold,color,size,italic,name,underline}, fill: {color}, borders: [{sideIndex,style,color,weight}], horizontalAlignment, verticalAlignment, wrapText, columnWidth, rowHeight }."
|
|
601
610
|
},
|
|
602
611
|
{
|
|
603
612
|
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range()/sort",
|
|
@@ -614,6 +623,14 @@
|
|
|
614
623
|
"scopes": ["Files.Read"],
|
|
615
624
|
"skipEncoding": ["address"]
|
|
616
625
|
},
|
|
626
|
+
{
|
|
627
|
+
"pathPattern": "/me/messages/{message-id}/$value",
|
|
628
|
+
"method": "get",
|
|
629
|
+
"toolName": "get-mail-message-mime",
|
|
630
|
+
"scopes": ["Mail.Read"],
|
|
631
|
+
"acceptType": "text/plain",
|
|
632
|
+
"llmTip": "Download an email message as raw RFC 5322 MIME content (.eml format). Use this when archiving an email to disk preserving all original headers, body, and inline-encoded attachments. Returns the MIME stream as text. Find the message id with list-mail-messages first."
|
|
633
|
+
},
|
|
617
634
|
{
|
|
618
635
|
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')",
|
|
619
636
|
"method": "patch",
|
|
@@ -641,6 +658,41 @@
|
|
|
641
658
|
"skipEncoding": ["address"],
|
|
642
659
|
"llmTip": "Delete cells at the given range, shifting remaining content. Body: { shift: 'Up' } or { shift: 'Left' }. Use 'Up' to delete entire rows."
|
|
643
660
|
},
|
|
661
|
+
{
|
|
662
|
+
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')/merge",
|
|
663
|
+
"method": "post",
|
|
664
|
+
"toolName": "merge-excel-range",
|
|
665
|
+
"isExcelOp": true,
|
|
666
|
+
"scopes": ["Files.ReadWrite"],
|
|
667
|
+
"skipEncoding": ["address"],
|
|
668
|
+
"llmTip": "Merge the cells in the given range into a single cell. Body: { across: false } merges the entire range into one cell; { across: true } merges each row separately. Useful for building styled headers, banner rows, and report layouts."
|
|
669
|
+
},
|
|
670
|
+
{
|
|
671
|
+
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')/unmerge",
|
|
672
|
+
"method": "post",
|
|
673
|
+
"toolName": "unmerge-excel-range",
|
|
674
|
+
"isExcelOp": true,
|
|
675
|
+
"scopes": ["Files.ReadWrite"],
|
|
676
|
+
"skipEncoding": ["address"],
|
|
677
|
+
"llmTip": "Unmerge any merged cells within the given range back into individual cells. No request body. Inverse of merge-excel-range."
|
|
678
|
+
},
|
|
679
|
+
{
|
|
680
|
+
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')/clear",
|
|
681
|
+
"method": "post",
|
|
682
|
+
"toolName": "clear-excel-range",
|
|
683
|
+
"isExcelOp": true,
|
|
684
|
+
"scopes": ["Files.ReadWrite"],
|
|
685
|
+
"skipEncoding": ["address"],
|
|
686
|
+
"llmTip": "Clear cell contents and/or formatting on the given range. Body: { applyTo: 'All' | 'Formats' | 'Contents' }. 'Contents' wipes values but keeps formatting; 'Formats' resets styling but keeps values; 'All' wipes both. Use this to reset a worksheet section before a fresh write rather than overwriting cell-by-cell."
|
|
687
|
+
},
|
|
688
|
+
{
|
|
689
|
+
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/usedRange()",
|
|
690
|
+
"method": "get",
|
|
691
|
+
"toolName": "get-excel-used-range",
|
|
692
|
+
"isExcelOp": true,
|
|
693
|
+
"scopes": ["Files.Read"],
|
|
694
|
+
"llmTip": "Get the smallest range that encompasses any cells with values or formatting on the worksheet. Returns address, values, formulas, numberFormat, rowCount, columnCount. Use this to discover the populated bounds of a sheet before reading or appending — avoids guessing how far data extends. Optional $select to trim the response."
|
|
695
|
+
},
|
|
644
696
|
{
|
|
645
697
|
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/tables/{workbookTable-id}/rows/itemAt(index={index})",
|
|
646
698
|
"method": "patch",
|
package/dist/generated/client.js
CHANGED
|
@@ -1320,6 +1320,7 @@ const microsoft_graph_workbookWorksheetCollectionResponse = z.object({
|
|
|
1320
1320
|
value: z.array(microsoft_graph_workbookWorksheet)
|
|
1321
1321
|
}).partial().passthrough();
|
|
1322
1322
|
const create_excel_chart_Body = z.object({ type: z.string(), sourceData: z.unknown(), seriesBy: z.string() }).partial().passthrough();
|
|
1323
|
+
const microsoft_graph_workbookRangeSort = z.object({ id: z.string().describe("The unique identifier for an entity. Read-only.").optional() }).passthrough();
|
|
1323
1324
|
const microsoft_graph_workbookRangeBorder = z.object({
|
|
1324
1325
|
id: z.string().describe("The unique identifier for an entity. Read-only.").optional(),
|
|
1325
1326
|
color: z.string().describe(
|
|
@@ -1385,7 +1386,6 @@ const microsoft_graph_workbookRangeFormat = z.object({
|
|
|
1385
1386
|
font: microsoft_graph_workbookRangeFont.optional(),
|
|
1386
1387
|
protection: microsoft_graph_workbookFormatProtection.optional()
|
|
1387
1388
|
}).passthrough();
|
|
1388
|
-
const microsoft_graph_workbookRangeSort = z.object({ id: z.string().describe("The unique identifier for an entity. Read-only.").optional() }).passthrough();
|
|
1389
1389
|
const microsoft_graph_workbookRange = z.object({
|
|
1390
1390
|
id: z.string().describe("The unique identifier for an entity. Read-only.").optional(),
|
|
1391
1391
|
address: z.string().describe(
|
|
@@ -4646,12 +4646,12 @@ const schemas = {
|
|
|
4646
4646
|
microsoft_graph_workbookTableRowCollectionResponse,
|
|
4647
4647
|
microsoft_graph_workbookWorksheetCollectionResponse,
|
|
4648
4648
|
create_excel_chart_Body,
|
|
4649
|
+
microsoft_graph_workbookRangeSort,
|
|
4649
4650
|
microsoft_graph_workbookRangeBorder,
|
|
4650
4651
|
microsoft_graph_workbookRangeFill,
|
|
4651
4652
|
microsoft_graph_workbookRangeFont,
|
|
4652
4653
|
microsoft_graph_workbookFormatProtection,
|
|
4653
4654
|
microsoft_graph_workbookRangeFormat,
|
|
4654
|
-
microsoft_graph_workbookRangeSort,
|
|
4655
4655
|
microsoft_graph_workbookRange,
|
|
4656
4656
|
create_excel_table_Body,
|
|
4657
4657
|
microsoft_graph_assignedLabel,
|
|
@@ -4962,6 +4962,22 @@ const schemas = {
|
|
|
4962
4962
|
microsoft_graph_userCollectionResponse
|
|
4963
4963
|
};
|
|
4964
4964
|
const endpoints = makeApi([
|
|
4965
|
+
{
|
|
4966
|
+
method: "post",
|
|
4967
|
+
path: "/$batch",
|
|
4968
|
+
alias: "graph-batch",
|
|
4969
|
+
description: `Combine up to 20 Graph requests into a single HTTP call. Body: { requests: [{ id: '1', method: 'GET'|'POST'|'PATCH'|'DELETE', url: '/me/messages?$top=5', headers?: {...}, body?: {...}, dependsOn?: ['1'] }, ...] }. Returns { responses: [{ id, status, body, headers }] } in arbitrary order \u2014 match by id. Use cases: (1) parallelize many small reads (e.g. fetch 15 mail messages by id in one round-trip); (2) sequence dependent writes via dependsOn; (3) batch many Excel range writes into one call to dramatically reduce latency on large workbook builds. Note: each sub-request URL is relative to the Graph version root (/me/..., /drives/..., NOT https://graph.microsoft.com/v1.0/...).`,
|
|
4970
|
+
requestFormat: "json",
|
|
4971
|
+
parameters: [
|
|
4972
|
+
{
|
|
4973
|
+
name: "body",
|
|
4974
|
+
description: `Operation payload`,
|
|
4975
|
+
type: "Body",
|
|
4976
|
+
schema: z.object({}).partial().passthrough().passthrough()
|
|
4977
|
+
}
|
|
4978
|
+
],
|
|
4979
|
+
response: z.void()
|
|
4980
|
+
},
|
|
4965
4981
|
{
|
|
4966
4982
|
method: "post",
|
|
4967
4983
|
path: "/chats",
|
|
@@ -6059,6 +6075,26 @@ Items with this property set should be removed from your local state.`,
|
|
|
6059
6075
|
description: `Operation payload`,
|
|
6060
6076
|
type: "Body",
|
|
6061
6077
|
schema: z.object({}).partial().passthrough().passthrough()
|
|
6078
|
+
},
|
|
6079
|
+
{
|
|
6080
|
+
name: "driveId",
|
|
6081
|
+
type: "Path",
|
|
6082
|
+
schema: z.string().describe("Path parameter: drive-id")
|
|
6083
|
+
},
|
|
6084
|
+
{
|
|
6085
|
+
name: "driveItemId",
|
|
6086
|
+
type: "Path",
|
|
6087
|
+
schema: z.string().describe("Path parameter: driveItem-id")
|
|
6088
|
+
},
|
|
6089
|
+
{
|
|
6090
|
+
name: "workbookTableId",
|
|
6091
|
+
type: "Path",
|
|
6092
|
+
schema: z.string().describe("Path parameter: workbookTable-id")
|
|
6093
|
+
},
|
|
6094
|
+
{
|
|
6095
|
+
name: "index",
|
|
6096
|
+
type: "Path",
|
|
6097
|
+
schema: z.string().describe("Path parameter: index")
|
|
6062
6098
|
}
|
|
6063
6099
|
],
|
|
6064
6100
|
response: z.void()
|
|
@@ -6069,6 +6105,28 @@ Items with this property set should be removed from your local state.`,
|
|
|
6069
6105
|
alias: "delete-excel-table-row",
|
|
6070
6106
|
description: `Delete a single row from a formal Excel table by zero-based row index.`,
|
|
6071
6107
|
requestFormat: "json",
|
|
6108
|
+
parameters: [
|
|
6109
|
+
{
|
|
6110
|
+
name: "driveId",
|
|
6111
|
+
type: "Path",
|
|
6112
|
+
schema: z.string().describe("Path parameter: drive-id")
|
|
6113
|
+
},
|
|
6114
|
+
{
|
|
6115
|
+
name: "driveItemId",
|
|
6116
|
+
type: "Path",
|
|
6117
|
+
schema: z.string().describe("Path parameter: driveItem-id")
|
|
6118
|
+
},
|
|
6119
|
+
{
|
|
6120
|
+
name: "workbookTableId",
|
|
6121
|
+
type: "Path",
|
|
6122
|
+
schema: z.string().describe("Path parameter: workbookTable-id")
|
|
6123
|
+
},
|
|
6124
|
+
{
|
|
6125
|
+
name: "index",
|
|
6126
|
+
type: "Path",
|
|
6127
|
+
schema: z.string().describe("Path parameter: index")
|
|
6128
|
+
}
|
|
6129
|
+
],
|
|
6072
6130
|
response: z.void()
|
|
6073
6131
|
},
|
|
6074
6132
|
{
|
|
@@ -6137,22 +6195,6 @@ Items with this property set should be removed from your local state.`,
|
|
|
6137
6195
|
],
|
|
6138
6196
|
response: z.void()
|
|
6139
6197
|
},
|
|
6140
|
-
{
|
|
6141
|
-
method: "patch",
|
|
6142
|
-
path: "/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range()/format",
|
|
6143
|
-
alias: "format-excel-range",
|
|
6144
|
-
description: `Update the navigation property format in drives`,
|
|
6145
|
-
requestFormat: "json",
|
|
6146
|
-
parameters: [
|
|
6147
|
-
{
|
|
6148
|
-
name: "body",
|
|
6149
|
-
description: `New navigation property values`,
|
|
6150
|
-
type: "Body",
|
|
6151
|
-
schema: microsoft_graph_workbookRangeFormat
|
|
6152
|
-
}
|
|
6153
|
-
],
|
|
6154
|
-
response: z.void()
|
|
6155
|
-
},
|
|
6156
6198
|
{
|
|
6157
6199
|
method: "patch",
|
|
6158
6200
|
path: "/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range()/sort",
|
|
@@ -6191,6 +6233,42 @@ Items with this property set should be removed from your local state.`,
|
|
|
6191
6233
|
description: `Operation payload`,
|
|
6192
6234
|
type: "Body",
|
|
6193
6235
|
schema: z.object({}).partial().passthrough().passthrough()
|
|
6236
|
+
},
|
|
6237
|
+
{
|
|
6238
|
+
name: "driveId",
|
|
6239
|
+
type: "Path",
|
|
6240
|
+
schema: z.string().describe("Path parameter: drive-id")
|
|
6241
|
+
},
|
|
6242
|
+
{
|
|
6243
|
+
name: "driveItemId",
|
|
6244
|
+
type: "Path",
|
|
6245
|
+
schema: z.string().describe("Path parameter: driveItem-id")
|
|
6246
|
+
},
|
|
6247
|
+
{
|
|
6248
|
+
name: "workbookWorksheetId",
|
|
6249
|
+
type: "Path",
|
|
6250
|
+
schema: z.string().describe("Path parameter: workbookWorksheet-id")
|
|
6251
|
+
},
|
|
6252
|
+
{
|
|
6253
|
+
name: "address",
|
|
6254
|
+
type: "Path",
|
|
6255
|
+
schema: z.string().describe("Path parameter: address")
|
|
6256
|
+
}
|
|
6257
|
+
],
|
|
6258
|
+
response: z.void()
|
|
6259
|
+
},
|
|
6260
|
+
{
|
|
6261
|
+
method: "post",
|
|
6262
|
+
path: `/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range(address=':address')/clear`,
|
|
6263
|
+
alias: "clear-excel-range",
|
|
6264
|
+
description: `Invoke action clear`,
|
|
6265
|
+
requestFormat: "json",
|
|
6266
|
+
parameters: [
|
|
6267
|
+
{
|
|
6268
|
+
name: "body",
|
|
6269
|
+
description: `Action parameters`,
|
|
6270
|
+
type: "Body",
|
|
6271
|
+
schema: z.object({ applyTo: z.string() }).partial().passthrough()
|
|
6194
6272
|
}
|
|
6195
6273
|
],
|
|
6196
6274
|
response: z.void()
|
|
@@ -6211,6 +6289,22 @@ Items with this property set should be removed from your local state.`,
|
|
|
6211
6289
|
],
|
|
6212
6290
|
response: z.void()
|
|
6213
6291
|
},
|
|
6292
|
+
{
|
|
6293
|
+
method: "patch",
|
|
6294
|
+
path: `/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range(address=':address')/format`,
|
|
6295
|
+
alias: "format-excel-range",
|
|
6296
|
+
description: `Update the navigation property format in drives`,
|
|
6297
|
+
requestFormat: "json",
|
|
6298
|
+
parameters: [
|
|
6299
|
+
{
|
|
6300
|
+
name: "body",
|
|
6301
|
+
description: `New navigation property values`,
|
|
6302
|
+
type: "Body",
|
|
6303
|
+
schema: microsoft_graph_workbookRangeFormat
|
|
6304
|
+
}
|
|
6305
|
+
],
|
|
6306
|
+
response: z.void()
|
|
6307
|
+
},
|
|
6214
6308
|
{
|
|
6215
6309
|
method: "post",
|
|
6216
6310
|
path: `/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range(address=':address')/insert`,
|
|
@@ -6227,6 +6321,30 @@ Items with this property set should be removed from your local state.`,
|
|
|
6227
6321
|
],
|
|
6228
6322
|
response: z.void()
|
|
6229
6323
|
},
|
|
6324
|
+
{
|
|
6325
|
+
method: "post",
|
|
6326
|
+
path: `/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range(address=':address')/merge`,
|
|
6327
|
+
alias: "merge-excel-range",
|
|
6328
|
+
description: `Invoke action merge`,
|
|
6329
|
+
requestFormat: "json",
|
|
6330
|
+
parameters: [
|
|
6331
|
+
{
|
|
6332
|
+
name: "body",
|
|
6333
|
+
description: `Action parameters`,
|
|
6334
|
+
type: "Body",
|
|
6335
|
+
schema: z.object({ across: z.boolean().default(false) }).partial().passthrough()
|
|
6336
|
+
}
|
|
6337
|
+
],
|
|
6338
|
+
response: z.void()
|
|
6339
|
+
},
|
|
6340
|
+
{
|
|
6341
|
+
method: "post",
|
|
6342
|
+
path: `/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range(address=':address')/unmerge`,
|
|
6343
|
+
alias: "unmerge-excel-range",
|
|
6344
|
+
description: `Invoke action unmerge`,
|
|
6345
|
+
requestFormat: "json",
|
|
6346
|
+
response: z.void()
|
|
6347
|
+
},
|
|
6230
6348
|
{
|
|
6231
6349
|
method: "post",
|
|
6232
6350
|
path: "/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/tables/add",
|
|
@@ -6243,6 +6361,14 @@ Items with this property set should be removed from your local state.`,
|
|
|
6243
6361
|
],
|
|
6244
6362
|
response: z.void()
|
|
6245
6363
|
},
|
|
6364
|
+
{
|
|
6365
|
+
method: "get",
|
|
6366
|
+
path: "/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/usedRange()",
|
|
6367
|
+
alias: "get-excel-used-range",
|
|
6368
|
+
description: `Invoke function usedRange`,
|
|
6369
|
+
requestFormat: "json",
|
|
6370
|
+
response: z.void()
|
|
6371
|
+
},
|
|
6246
6372
|
{
|
|
6247
6373
|
method: "get",
|
|
6248
6374
|
path: "/drives/:driveId/root",
|
|
@@ -9385,6 +9511,21 @@ having to fetch the entire set of messages from the server every time.`,
|
|
|
9385
9511
|
],
|
|
9386
9512
|
response: z.void()
|
|
9387
9513
|
},
|
|
9514
|
+
{
|
|
9515
|
+
method: "get",
|
|
9516
|
+
path: "/me/messages/:messageId/$value",
|
|
9517
|
+
alias: "get-mail-message-mime",
|
|
9518
|
+
description: `Get an open extension (openTypeExtension object) identified by name or fully qualified name. The table in the Permissions section lists the resources that support open extensions. The following table lists the three scenarios where you can get an open extension from a supported resource instance.`,
|
|
9519
|
+
requestFormat: "json",
|
|
9520
|
+
parameters: [
|
|
9521
|
+
{
|
|
9522
|
+
name: "includeHiddenMessages",
|
|
9523
|
+
type: "Query",
|
|
9524
|
+
schema: z.string().describe("Include Hidden Messages").optional()
|
|
9525
|
+
}
|
|
9526
|
+
],
|
|
9527
|
+
response: z.void()
|
|
9528
|
+
},
|
|
9388
9529
|
{
|
|
9389
9530
|
method: "get",
|
|
9390
9531
|
path: "/me/messages/:messageId/attachments",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@softeria/ms-365-mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.96.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",
|
package/src/endpoints.json
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"pathPattern": "/$batch",
|
|
4
|
+
"method": "post",
|
|
5
|
+
"toolName": "graph-batch",
|
|
6
|
+
"scopes": [],
|
|
7
|
+
"llmTip": "Combine up to 20 Graph requests into a single HTTP call. Body: { requests: [{ id: '1', method: 'GET'|'POST'|'PATCH'|'DELETE', url: '/me/messages?$top=5', headers?: {...}, body?: {...}, dependsOn?: ['1'] }, ...] }. Returns { responses: [{ id, status, body, headers }] } in arbitrary order — match by id. Use cases: (1) parallelize many small reads (e.g. fetch 15 mail messages by id in one round-trip); (2) sequence dependent writes via dependsOn; (3) batch many Excel range writes into one call to dramatically reduce latency on large workbook builds. Note: each sub-request URL is relative to the Graph version root (/me/..., /drives/..., NOT https://graph.microsoft.com/v1.0/...)."
|
|
8
|
+
},
|
|
2
9
|
{
|
|
3
10
|
"pathPattern": "/me/messages",
|
|
4
11
|
"method": "get",
|
|
@@ -593,11 +600,13 @@
|
|
|
593
600
|
"scopes": ["Files.ReadWrite"]
|
|
594
601
|
},
|
|
595
602
|
{
|
|
596
|
-
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range()/format",
|
|
603
|
+
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')/format",
|
|
597
604
|
"method": "patch",
|
|
598
605
|
"toolName": "format-excel-range",
|
|
599
606
|
"isExcelOp": true,
|
|
600
|
-
"scopes": ["Files.ReadWrite"]
|
|
607
|
+
"scopes": ["Files.ReadWrite"],
|
|
608
|
+
"skipEncoding": ["address"],
|
|
609
|
+
"llmTip": "Apply font/fill/borders/alignment/wrapText/columnWidth/rowHeight to a specific range. Required path param 'address' (e.g. 'A1:E5' or 'Sheet1!A1:E5'). Body: { font: {bold,color,size,italic,name,underline}, fill: {color}, borders: [{sideIndex,style,color,weight}], horizontalAlignment, verticalAlignment, wrapText, columnWidth, rowHeight }."
|
|
601
610
|
},
|
|
602
611
|
{
|
|
603
612
|
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range()/sort",
|
|
@@ -614,6 +623,14 @@
|
|
|
614
623
|
"scopes": ["Files.Read"],
|
|
615
624
|
"skipEncoding": ["address"]
|
|
616
625
|
},
|
|
626
|
+
{
|
|
627
|
+
"pathPattern": "/me/messages/{message-id}/$value",
|
|
628
|
+
"method": "get",
|
|
629
|
+
"toolName": "get-mail-message-mime",
|
|
630
|
+
"scopes": ["Mail.Read"],
|
|
631
|
+
"acceptType": "text/plain",
|
|
632
|
+
"llmTip": "Download an email message as raw RFC 5322 MIME content (.eml format). Use this when archiving an email to disk preserving all original headers, body, and inline-encoded attachments. Returns the MIME stream as text. Find the message id with list-mail-messages first."
|
|
633
|
+
},
|
|
617
634
|
{
|
|
618
635
|
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')",
|
|
619
636
|
"method": "patch",
|
|
@@ -641,6 +658,41 @@
|
|
|
641
658
|
"skipEncoding": ["address"],
|
|
642
659
|
"llmTip": "Delete cells at the given range, shifting remaining content. Body: { shift: 'Up' } or { shift: 'Left' }. Use 'Up' to delete entire rows."
|
|
643
660
|
},
|
|
661
|
+
{
|
|
662
|
+
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')/merge",
|
|
663
|
+
"method": "post",
|
|
664
|
+
"toolName": "merge-excel-range",
|
|
665
|
+
"isExcelOp": true,
|
|
666
|
+
"scopes": ["Files.ReadWrite"],
|
|
667
|
+
"skipEncoding": ["address"],
|
|
668
|
+
"llmTip": "Merge the cells in the given range into a single cell. Body: { across: false } merges the entire range into one cell; { across: true } merges each row separately. Useful for building styled headers, banner rows, and report layouts."
|
|
669
|
+
},
|
|
670
|
+
{
|
|
671
|
+
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')/unmerge",
|
|
672
|
+
"method": "post",
|
|
673
|
+
"toolName": "unmerge-excel-range",
|
|
674
|
+
"isExcelOp": true,
|
|
675
|
+
"scopes": ["Files.ReadWrite"],
|
|
676
|
+
"skipEncoding": ["address"],
|
|
677
|
+
"llmTip": "Unmerge any merged cells within the given range back into individual cells. No request body. Inverse of merge-excel-range."
|
|
678
|
+
},
|
|
679
|
+
{
|
|
680
|
+
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')/clear",
|
|
681
|
+
"method": "post",
|
|
682
|
+
"toolName": "clear-excel-range",
|
|
683
|
+
"isExcelOp": true,
|
|
684
|
+
"scopes": ["Files.ReadWrite"],
|
|
685
|
+
"skipEncoding": ["address"],
|
|
686
|
+
"llmTip": "Clear cell contents and/or formatting on the given range. Body: { applyTo: 'All' | 'Formats' | 'Contents' }. 'Contents' wipes values but keeps formatting; 'Formats' resets styling but keeps values; 'All' wipes both. Use this to reset a worksheet section before a fresh write rather than overwriting cell-by-cell."
|
|
687
|
+
},
|
|
688
|
+
{
|
|
689
|
+
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/usedRange()",
|
|
690
|
+
"method": "get",
|
|
691
|
+
"toolName": "get-excel-used-range",
|
|
692
|
+
"isExcelOp": true,
|
|
693
|
+
"scopes": ["Files.Read"],
|
|
694
|
+
"llmTip": "Get the smallest range that encompasses any cells with values or formatting on the worksheet. Returns address, values, formulas, numberFormat, rowCount, columnCount. Use this to discover the populated bounds of a sheet before reading or appending — avoids guessing how far data extends. Optional $select to trim the response."
|
|
695
|
+
},
|
|
644
696
|
{
|
|
645
697
|
"pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/tables/{workbookTable-id}/rows/itemAt(index={index})",
|
|
646
698
|
"method": "patch",
|