@softeria/ms-365-mcp-server 0.148.0 → 0.148.2
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/dist/endpoints.json
CHANGED
|
@@ -510,7 +510,7 @@
|
|
|
510
510
|
"scopes": ["Calendars.Read"],
|
|
511
511
|
"supportsTimezone": true,
|
|
512
512
|
"supportsExpandExtendedProperties": true,
|
|
513
|
-
"llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for the default calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Use get-specific-calendar-view if you need a non-default calendar. To find Teams meetings, use $filter=isOnlineMeeting eq true. To search by subject, use $filter=contains(subject,'keyword'). Teams meetings
|
|
513
|
+
"llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for the default calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Use get-specific-calendar-view if you need a non-default calendar. To find Teams meetings, use $filter=isOnlineMeeting eq true. To search by subject, use $filter=contains(subject,'keyword'). Teams meetings expose their join link as onlineMeeting/joinUrl (select it with $select=onlineMeeting); the event resource has no joinWebUrl property. Pass that joinUrl to list-online-meetings as $filter=JoinWebUrl eq '{url}' to reach transcripts."
|
|
514
514
|
},
|
|
515
515
|
{
|
|
516
516
|
"pathPattern": "/me/calendars/{calendar-id}/calendarView",
|
|
@@ -521,7 +521,7 @@
|
|
|
521
521
|
"scopes": ["Calendars.Read"],
|
|
522
522
|
"supportsTimezone": true,
|
|
523
523
|
"supportsExpandExtendedProperties": true,
|
|
524
|
-
"llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for a specific calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Each instance includes seriesMasterId and type (occurrence/exception) fields for recurring event linkage. Use fetchAllPages=true to retrieve all results when there are many events. To find Teams meetings, use $filter=isOnlineMeeting eq true. Teams meetings
|
|
524
|
+
"llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for a specific calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Each instance includes seriesMasterId and type (occurrence/exception) fields for recurring event linkage. Use fetchAllPages=true to retrieve all results when there are many events. To find Teams meetings, use $filter=isOnlineMeeting eq true. Teams meetings expose their join link as onlineMeeting/joinUrl (select it with $select=onlineMeeting); the event resource has no joinWebUrl property. Pass that joinUrl to list-online-meetings as $filter=JoinWebUrl eq '{url}' to reach transcripts."
|
|
525
525
|
},
|
|
526
526
|
{
|
|
527
527
|
"pathPattern": "/me/calendar/getSchedule",
|
|
@@ -1592,7 +1592,8 @@
|
|
|
1592
1592
|
"method": "get",
|
|
1593
1593
|
"toolName": "list-chats",
|
|
1594
1594
|
"presets": ["teams", "teams-write", "work"],
|
|
1595
|
-
"workScopes": ["Chat.ReadBasic"]
|
|
1595
|
+
"workScopes": ["Chat.ReadBasic"],
|
|
1596
|
+
"llmTip": "Lists the signed-in user's chats. Only $filter, $top (max 50), $expand (members, lastMessagePreview) and $orderby are supported; $orderby accepts just lastMessagePreview/createdDateTime in descending order. Other options are rejected: $search returns 400 'Query option Search is not allowed', and ordering by lastUpdatedDateTime returns 400 BadRequest. Meeting chats have chatType=meeting and carry the meeting subject in topic."
|
|
1596
1597
|
},
|
|
1597
1598
|
{
|
|
1598
1599
|
"pathPattern": "/chats/{chat-id}",
|
|
@@ -1614,7 +1615,8 @@
|
|
|
1614
1615
|
"method": "get",
|
|
1615
1616
|
"toolName": "list-chat-messages",
|
|
1616
1617
|
"presets": ["teams", "work"],
|
|
1617
|
-
"workScopes": ["ChatMessage.Read"]
|
|
1618
|
+
"workScopes": ["ChatMessage.Read"],
|
|
1619
|
+
"llmTip": "Lists messages in a chat. $top is capped at 50 (higher values return 400) and $orderby accepts only descending order on createdDateTime or lastModifiedDateTime - ascending is rejected. Meeting chats mostly hold system events; transcripts are not available here, use list-meeting-transcripts instead."
|
|
1618
1620
|
},
|
|
1619
1621
|
{
|
|
1620
1622
|
"pathPattern": "/chats/{chat-id}/messages/{chatMessage-id}",
|
|
@@ -2079,7 +2081,7 @@
|
|
|
2079
2081
|
"toolName": "list-online-meetings",
|
|
2080
2082
|
"presets": ["teams", "work"],
|
|
2081
2083
|
"workScopes": ["OnlineMeetings.Read"],
|
|
2082
|
-
"llmTip": "
|
|
2084
|
+
"llmTip": "Look up a meeting with $filter=JoinWebUrl eq '{url}', using the joinUrl from an event's onlineMeeting property. This filter is required: the collection cannot be listed or paged, and $search/$orderby are not supported. Without it Graph returns 400 InvalidArgument ('One of the required parameters to lookup meeting by QueryOptions is null or empty'). Returns the meeting ID needed for transcript access."
|
|
2083
2085
|
},
|
|
2084
2086
|
{
|
|
2085
2087
|
"pathPattern": "/me/onlineMeetings/{onlineMeeting-id}",
|
package/dist/graph-tools.js
CHANGED
|
@@ -42,6 +42,7 @@ import {
|
|
|
42
42
|
CONFIRM_PARAM_DESCRIPTION,
|
|
43
43
|
TIMEZONE_PARAM_DESCRIPTION,
|
|
44
44
|
EXPAND_EXTENDED_PROPERTIES_PARAM_DESCRIPTION,
|
|
45
|
+
getAcceptParamDescription,
|
|
45
46
|
getAccountParamDescription,
|
|
46
47
|
getFetchAllPagesParamDescription
|
|
47
48
|
} from "./lib/param-descriptions.js";
|
|
@@ -968,6 +969,8 @@ async function executeGraphTool(tool, config, graphClient, params, authManager)
|
|
|
968
969
|
const encodedValue = encodeURIComponent(paramValue).replace(/%3D/g, "=");
|
|
969
970
|
path2 = path2.replace(`{${paramName}}`, encodedValue).replace(`:${paramName}`, encodedValue).replace(`{${camelCaseParamName}}`, encodedValue).replace(`:${camelCaseParamName}`, encodedValue);
|
|
970
971
|
logger.info(`Path param fallback: replaced :${camelCaseParamName} with encoded value`);
|
|
972
|
+
} else if (paramName.toLowerCase() === "accept" && config?.acceptType) {
|
|
973
|
+
headers["Accept"] = `${paramValue}`;
|
|
971
974
|
} else if (isOdataParam) {
|
|
972
975
|
queryParams[fixedParamName] = `${paramValue}`;
|
|
973
976
|
logger.info(`OData param fallback: forwarded ${fixedParamName}=${paramValue}`);
|
|
@@ -1053,7 +1056,7 @@ async function executeGraphTool(tool, config, graphClient, params, authManager)
|
|
|
1053
1056
|
headers["Content-Type"] = config.contentType;
|
|
1054
1057
|
logger.info(`Setting custom Content-Type: ${config.contentType}`);
|
|
1055
1058
|
}
|
|
1056
|
-
if (config?.acceptType) {
|
|
1059
|
+
if (config?.acceptType && !headers["Accept"]) {
|
|
1057
1060
|
headers["Accept"] = config.acceptType;
|
|
1058
1061
|
logger.info(`Setting custom Accept: ${config.acceptType}`);
|
|
1059
1062
|
}
|
|
@@ -1318,6 +1321,9 @@ function registerGraphTools(server, graphClient, readOnly = false, enabledToolsP
|
|
|
1318
1321
|
paramSchema[pathParamName] = z.string().describe(describePathParam(pathParamName));
|
|
1319
1322
|
}
|
|
1320
1323
|
}
|
|
1324
|
+
if (endpointConfig?.acceptType && paramSchema["Accept"] === void 0) {
|
|
1325
|
+
paramSchema["Accept"] = z.string().describe(getAcceptParamDescription(endpointConfig.acceptType)).optional();
|
|
1326
|
+
}
|
|
1321
1327
|
if (isFetchAllPagesApplicable(tool)) {
|
|
1322
1328
|
const maxPages = getMaxPages();
|
|
1323
1329
|
paramSchema["fetchAllPages"] = z.boolean().describe(getFetchAllPagesParamDescription(maxPages)).optional();
|
|
@@ -39,6 +39,9 @@ const COUNT_PARAM_DESCRIPTION = "Set true to enable advanced query mode (Consist
|
|
|
39
39
|
const CONFIRM_PARAM_DESCRIPTION = 'For destructive operations when the confirm gate is enabled (MS365_MCP_REQUIRE_CONFIRM=true; off by default). Set to true only after the user has explicitly approved this action. When the gate is on, calls without confirm: true return { error: "confirmation_required" } without touching user data.';
|
|
40
40
|
const TIMEZONE_PARAM_DESCRIPTION = 'IANA timezone name (e.g., "America/New_York", "Europe/London", "Asia/Tokyo") for calendar event times. If not specified, times are returned in UTC.';
|
|
41
41
|
const EXPAND_EXTENDED_PROPERTIES_PARAM_DESCRIPTION = "When true, expands singleValueExtendedProperties on each event. Use this to retrieve custom extended properties (e.g., sync metadata) stored on calendar events.";
|
|
42
|
+
function getAcceptParamDescription(acceptType) {
|
|
43
|
+
return `Accept header for the response representation. Defaults to "${acceptType}". Only set this when Graph asks for a different format \u2014 e.g. a 403 SpeakerAttributionNotAllowed on transcript content names the media type to retry with.`;
|
|
44
|
+
}
|
|
42
45
|
function getAccountParamDescription(accountNames) {
|
|
43
46
|
const accountHint = accountNames.length > 0 ? `Known accounts: ${accountNames.join(", ")}. ` : "";
|
|
44
47
|
return `${accountHint}Microsoft account email to use for this request. Required when multiple accounts are configured. Use the list-accounts tool to discover all currently available accounts.`;
|
|
@@ -82,6 +85,7 @@ export {
|
|
|
82
85
|
TIMEZONE_PARAM_DESCRIPTION,
|
|
83
86
|
TOP_PARAM_DESCRIPTION,
|
|
84
87
|
TOP_UNSUPPORTED_DELTA_TOOLS,
|
|
88
|
+
getAcceptParamDescription,
|
|
85
89
|
getAccountParamDescription,
|
|
86
90
|
getFetchAllPagesParamDescription,
|
|
87
91
|
getMaxPages,
|
package/dist/lib/tool-schema.js
CHANGED
|
@@ -9,7 +9,8 @@ import {
|
|
|
9
9
|
getAccountParamDescription,
|
|
10
10
|
CONFIRM_PARAM_DESCRIPTION,
|
|
11
11
|
TIMEZONE_PARAM_DESCRIPTION,
|
|
12
|
-
EXPAND_EXTENDED_PROPERTIES_PARAM_DESCRIPTION
|
|
12
|
+
EXPAND_EXTENDED_PROPERTIES_PARAM_DESCRIPTION,
|
|
13
|
+
getAcceptParamDescription
|
|
13
14
|
} from "./param-descriptions.js";
|
|
14
15
|
function unwrapOptional(schema) {
|
|
15
16
|
const def = schema._def;
|
|
@@ -83,6 +84,15 @@ function describeToolSchema(tool, config, ctx = {}) {
|
|
|
83
84
|
schema: { type: "boolean" }
|
|
84
85
|
});
|
|
85
86
|
}
|
|
87
|
+
if (config?.acceptType && !params.some((p) => p.name.toLowerCase() === "accept")) {
|
|
88
|
+
params.push({
|
|
89
|
+
name: "Accept",
|
|
90
|
+
in: "Header",
|
|
91
|
+
required: false,
|
|
92
|
+
description: getAcceptParamDescription(config.acceptType),
|
|
93
|
+
schema: { type: "string" }
|
|
94
|
+
});
|
|
95
|
+
}
|
|
86
96
|
const llmTip = config?.llmTip;
|
|
87
97
|
return {
|
|
88
98
|
name: tool.alias,
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@softeria/ms-365-mcp-server",
|
|
3
3
|
"mcpName": "io.github.Softeria/ms-365-mcp-server",
|
|
4
|
-
"version": "0.148.
|
|
4
|
+
"version": "0.148.2",
|
|
5
5
|
"description": " A Model Context Protocol (MCP) server for interacting with Microsoft 365 and Office services through the Graph API",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "dist/index.js",
|
package/src/endpoints.json
CHANGED
|
@@ -510,7 +510,7 @@
|
|
|
510
510
|
"scopes": ["Calendars.Read"],
|
|
511
511
|
"supportsTimezone": true,
|
|
512
512
|
"supportsExpandExtendedProperties": true,
|
|
513
|
-
"llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for the default calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Use get-specific-calendar-view if you need a non-default calendar. To find Teams meetings, use $filter=isOnlineMeeting eq true. To search by subject, use $filter=contains(subject,'keyword'). Teams meetings
|
|
513
|
+
"llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for the default calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Use get-specific-calendar-view if you need a non-default calendar. To find Teams meetings, use $filter=isOnlineMeeting eq true. To search by subject, use $filter=contains(subject,'keyword'). Teams meetings expose their join link as onlineMeeting/joinUrl (select it with $select=onlineMeeting); the event resource has no joinWebUrl property. Pass that joinUrl to list-online-meetings as $filter=JoinWebUrl eq '{url}' to reach transcripts."
|
|
514
514
|
},
|
|
515
515
|
{
|
|
516
516
|
"pathPattern": "/me/calendars/{calendar-id}/calendarView",
|
|
@@ -521,7 +521,7 @@
|
|
|
521
521
|
"scopes": ["Calendars.Read"],
|
|
522
522
|
"supportsTimezone": true,
|
|
523
523
|
"supportsExpandExtendedProperties": true,
|
|
524
|
-
"llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for a specific calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Each instance includes seriesMasterId and type (occurrence/exception) fields for recurring event linkage. Use fetchAllPages=true to retrieve all results when there are many events. To find Teams meetings, use $filter=isOnlineMeeting eq true. Teams meetings
|
|
524
|
+
"llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for a specific calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Each instance includes seriesMasterId and type (occurrence/exception) fields for recurring event linkage. Use fetchAllPages=true to retrieve all results when there are many events. To find Teams meetings, use $filter=isOnlineMeeting eq true. Teams meetings expose their join link as onlineMeeting/joinUrl (select it with $select=onlineMeeting); the event resource has no joinWebUrl property. Pass that joinUrl to list-online-meetings as $filter=JoinWebUrl eq '{url}' to reach transcripts."
|
|
525
525
|
},
|
|
526
526
|
{
|
|
527
527
|
"pathPattern": "/me/calendar/getSchedule",
|
|
@@ -1592,7 +1592,8 @@
|
|
|
1592
1592
|
"method": "get",
|
|
1593
1593
|
"toolName": "list-chats",
|
|
1594
1594
|
"presets": ["teams", "teams-write", "work"],
|
|
1595
|
-
"workScopes": ["Chat.ReadBasic"]
|
|
1595
|
+
"workScopes": ["Chat.ReadBasic"],
|
|
1596
|
+
"llmTip": "Lists the signed-in user's chats. Only $filter, $top (max 50), $expand (members, lastMessagePreview) and $orderby are supported; $orderby accepts just lastMessagePreview/createdDateTime in descending order. Other options are rejected: $search returns 400 'Query option Search is not allowed', and ordering by lastUpdatedDateTime returns 400 BadRequest. Meeting chats have chatType=meeting and carry the meeting subject in topic."
|
|
1596
1597
|
},
|
|
1597
1598
|
{
|
|
1598
1599
|
"pathPattern": "/chats/{chat-id}",
|
|
@@ -1614,7 +1615,8 @@
|
|
|
1614
1615
|
"method": "get",
|
|
1615
1616
|
"toolName": "list-chat-messages",
|
|
1616
1617
|
"presets": ["teams", "work"],
|
|
1617
|
-
"workScopes": ["ChatMessage.Read"]
|
|
1618
|
+
"workScopes": ["ChatMessage.Read"],
|
|
1619
|
+
"llmTip": "Lists messages in a chat. $top is capped at 50 (higher values return 400) and $orderby accepts only descending order on createdDateTime or lastModifiedDateTime - ascending is rejected. Meeting chats mostly hold system events; transcripts are not available here, use list-meeting-transcripts instead."
|
|
1618
1620
|
},
|
|
1619
1621
|
{
|
|
1620
1622
|
"pathPattern": "/chats/{chat-id}/messages/{chatMessage-id}",
|
|
@@ -2079,7 +2081,7 @@
|
|
|
2079
2081
|
"toolName": "list-online-meetings",
|
|
2080
2082
|
"presets": ["teams", "work"],
|
|
2081
2083
|
"workScopes": ["OnlineMeetings.Read"],
|
|
2082
|
-
"llmTip": "
|
|
2084
|
+
"llmTip": "Look up a meeting with $filter=JoinWebUrl eq '{url}', using the joinUrl from an event's onlineMeeting property. This filter is required: the collection cannot be listed or paged, and $search/$orderby are not supported. Without it Graph returns 400 InvalidArgument ('One of the required parameters to lookup meeting by QueryOptions is null or empty'). Returns the meeting ID needed for transcript access."
|
|
2083
2085
|
},
|
|
2084
2086
|
{
|
|
2085
2087
|
"pathPattern": "/me/onlineMeetings/{onlineMeeting-id}",
|