@softeria/ms-365-mcp-server 0.106.0 → 0.106.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/.dockerignore +15 -0
- package/Dockerfile +2 -2
- package/dist/endpoints.json +16 -15
- package/dist/logger.js +23 -3
- package/package.json +1 -1
- package/src/endpoints.json +16 -15
package/.dockerignore
ADDED
package/Dockerfile
CHANGED
|
@@ -3,7 +3,7 @@ FROM node:24-alpine AS builder
|
|
|
3
3
|
WORKDIR /app
|
|
4
4
|
|
|
5
5
|
COPY package*.json ./
|
|
6
|
-
RUN npm
|
|
6
|
+
RUN npm ci
|
|
7
7
|
|
|
8
8
|
COPY . .
|
|
9
9
|
RUN npm run generate
|
|
@@ -17,6 +17,6 @@ COPY --from=builder /app/dist /app/dist
|
|
|
17
17
|
COPY --from=builder /app/package*.json ./
|
|
18
18
|
|
|
19
19
|
ENV NODE_ENV=production
|
|
20
|
-
RUN npm
|
|
20
|
+
RUN npm ci --ignore-scripts --omit=dev
|
|
21
21
|
|
|
22
22
|
ENTRYPOINT ["node", "dist/index.js"]
|
package/dist/endpoints.json
CHANGED
|
@@ -1883,21 +1883,21 @@
|
|
|
1883
1883
|
"toolName": "get-mail-tips",
|
|
1884
1884
|
"scopes": ["Mail.Read"],
|
|
1885
1885
|
"contentType": "application/json",
|
|
1886
|
-
"llmTip": "Looks up MailTips for one or more recipients before sending an email — answers 'is this person on auto-reply / OOF?', 'will my email exceed their mailbox quota?', 'are they an external recipient?', 'is this a mailbox or distribution list?'. Body: { EmailAddresses: ['user@contoso.com', ...]
|
|
1886
|
+
"llmTip": "Looks up MailTips for one or more recipients before sending an email — answers 'is this person on auto-reply / OOF?', 'will my email exceed their mailbox quota?', 'are they an external recipient?', 'is this a mailbox or distribution list?'. Body: { EmailAddresses: ['user@contoso.com', ...], MailTipsOptions: 'automaticReplies, mailboxFullStatus, customMailTip, externalMemberCount, totalMemberCount, maxMessageSize, deliveryRestriction, moderationStatus, recipientScope, recipientSuggestions' (comma-separated subset) }. Returns mailTips per recipient with the requested fields populated. Use this to short-circuit urgent emails when a recipient is OOF, or to warn before fanning out to a large DL."
|
|
1887
1887
|
},
|
|
1888
1888
|
{
|
|
1889
1889
|
"pathPattern": "/me/outlook/supportedTimeZones(TimeZoneStandard='{TimeZoneStandard}')",
|
|
1890
1890
|
"method": "get",
|
|
1891
1891
|
"toolName": "list-supported-time-zones",
|
|
1892
1892
|
"scopes": ["User.Read"],
|
|
1893
|
-
"llmTip": "Lists time zones the user's mailbox server supports. TimeZoneStandard path parameter must be one of:
|
|
1893
|
+
"llmTip": "Lists time zones the user's mailbox server supports. TimeZoneStandard path parameter must be one of: Windows (default — Windows time zone names like 'Pacific Standard Time'), or Iana (IANA / Olson names like 'America/Los_Angeles'). Note the PascalCase — the values are case-sensitive enums, not lowercase strings. Returns timeZoneInformation objects with alias and displayName. Use the result to validate or look up the value before calling update-mailbox-settings to change the user's preferred timeZone — the format must match what the server expects."
|
|
1894
1894
|
},
|
|
1895
1895
|
{
|
|
1896
1896
|
"pathPattern": "/me/outlook/supportedLanguages()",
|
|
1897
1897
|
"method": "get",
|
|
1898
1898
|
"toolName": "list-supported-languages",
|
|
1899
1899
|
"scopes": ["User.Read"],
|
|
1900
|
-
"llmTip": "Lists locales and languages the user's mailbox server supports for the Outlook UI and message rendering. Returns localeInfo objects with locale (e.g. 'en-US')
|
|
1900
|
+
"llmTip": "Lists locales and languages the user's mailbox server supports for the Outlook UI and message rendering. Returns localeInfo objects with locale (e.g. 'en-US') and displayName ('English (United States)'). Use this to validate the locale value before calling update-mailbox-settings to change the user's preferred language."
|
|
1901
1901
|
},
|
|
1902
1902
|
{
|
|
1903
1903
|
"pathPattern": "/me/calendar/calendarPermissions",
|
|
@@ -1939,35 +1939,35 @@
|
|
|
1939
1939
|
"method": "post",
|
|
1940
1940
|
"toolName": "create-contact-child-folder",
|
|
1941
1941
|
"scopes": ["Contacts.ReadWrite"],
|
|
1942
|
-
"llmTip": "Creates a sub-folder under an existing contact folder. Body: { displayName: 'Sub-folder name' }.
|
|
1942
|
+
"llmTip": "Creates a sub-folder under an existing contact folder. Body: { displayName: 'Sub-folder name' }. Use list-contact-folders to discover the parent id. The returned contactFolder has its own id usable with update-contact-folder, delete-contact-folder, list-contact-folder-contacts, and create-contact-in-folder — contactFolder ids are mailbox-unique regardless of nesting depth."
|
|
1943
1943
|
},
|
|
1944
1944
|
{
|
|
1945
1945
|
"pathPattern": "/me/contactFolders",
|
|
1946
1946
|
"method": "get",
|
|
1947
1947
|
"toolName": "list-contact-folders",
|
|
1948
1948
|
"scopes": ["Contacts.Read"],
|
|
1949
|
-
"llmTip": "Lists the user's Outlook contact folders (the named buckets that organize contacts). Always includes the built-in 'Contacts' folder; user-created folders also appear. Returns id, displayName,
|
|
1949
|
+
"llmTip": "Lists the user's Outlook contact folders (the named buckets that organize contacts). Always includes the built-in 'Contacts' folder; user-created folders also appear. Returns id, displayName, and parentFolderId. To identify the default folder, match displayName === 'Contacts'. Use this before list-contact-folder-contacts or create-contact-in-folder to discover folder ids. Supports OData query parameters."
|
|
1950
1950
|
},
|
|
1951
1951
|
{
|
|
1952
1952
|
"pathPattern": "/me/contactFolders",
|
|
1953
1953
|
"method": "post",
|
|
1954
1954
|
"toolName": "create-contact-folder",
|
|
1955
1955
|
"scopes": ["Contacts.ReadWrite"],
|
|
1956
|
-
"llmTip": "Creates a new contact folder under the user's mailbox root. Body: { displayName: 'Family' }. Returns the created contactFolder with its id.
|
|
1956
|
+
"llmTip": "Creates a new contact folder under the user's mailbox root. Body: { displayName: 'Family' }. Returns the created contactFolder with its id. To create a sub-folder under an existing folder, use create-contact-child-folder."
|
|
1957
1957
|
},
|
|
1958
1958
|
{
|
|
1959
1959
|
"pathPattern": "/me/contactFolders/{contactFolder-id}",
|
|
1960
1960
|
"method": "patch",
|
|
1961
1961
|
"toolName": "update-contact-folder",
|
|
1962
1962
|
"scopes": ["Contacts.ReadWrite"],
|
|
1963
|
-
"llmTip": "
|
|
1963
|
+
"llmTip": "Updates a contact folder. Body: { displayName?: 'New name', parentFolderId?: '<id>' } — both displayName (rename) and parentFolderId (move) are writable. The default 'Contacts' folder may not be renameable. Get the folder id via list-contact-folders."
|
|
1964
1964
|
},
|
|
1965
1965
|
{
|
|
1966
1966
|
"pathPattern": "/me/contactFolders/{contactFolder-id}",
|
|
1967
1967
|
"method": "delete",
|
|
1968
1968
|
"toolName": "delete-contact-folder",
|
|
1969
1969
|
"scopes": ["Contacts.ReadWrite"],
|
|
1970
|
-
"llmTip": "Deletes a contact folder
|
|
1970
|
+
"llmTip": "Deletes a contact folder. The default 'Contacts' folder cannot be deleted — Graph returns an error. The folder (and its contents) typically lands in Deleted Items rather than being permanently removed. Get the folder id via list-contact-folders."
|
|
1971
1971
|
},
|
|
1972
1972
|
{
|
|
1973
1973
|
"pathPattern": "/me/contactFolders/{contactFolder-id}/contacts",
|
|
@@ -2010,14 +2010,14 @@
|
|
|
2010
2010
|
"method": "delete",
|
|
2011
2011
|
"toolName": "delete-todo-task-list",
|
|
2012
2012
|
"scopes": ["Tasks.ReadWrite"],
|
|
2013
|
-
"llmTip": "Deletes a Microsoft To Do task list
|
|
2013
|
+
"llmTip": "Deletes a Microsoft To Do task list. Built-in lists (Flagged emails, the default Tasks list) cannot be deleted — the API returns an error for those. Get list ids via list-todo-task-lists."
|
|
2014
2014
|
},
|
|
2015
2015
|
{
|
|
2016
2016
|
"pathPattern": "/me/onenote/pages",
|
|
2017
2017
|
"method": "get",
|
|
2018
2018
|
"toolName": "list-onenote-pages",
|
|
2019
2019
|
"scopes": ["Notes.Read"],
|
|
2020
|
-
"llmTip": "Lists all OneNote pages across every notebook and section the user has access to — transverse alternative to walking notebooks → sections → pages. Default returns top 20 ordered by lastModifiedTime desc. Supports $
|
|
2020
|
+
"llmTip": "Lists all OneNote pages across every notebook and section the user has access to — transverse alternative to walking notebooks → sections → pages. Default returns top 20 ordered by lastModifiedTime desc. Supports $filter (e.g. lastModifiedTime gt 2026-01-01, or contains(tolower(title), 'topic') for title search), $top (max 100), $select, and $expand=parentNotebook,parentSection. Use this instead of bouncing through list-onenote-notebooks / list-all-onenote-sections / list-onenote-section-pages when you have a topic in mind."
|
|
2021
2021
|
},
|
|
2022
2022
|
{
|
|
2023
2023
|
"pathPattern": "/me/onenote/sectionGroups",
|
|
@@ -2032,7 +2032,7 @@
|
|
|
2032
2032
|
"toolName": "get-onenote-notebook-from-web-url",
|
|
2033
2033
|
"workScopes": ["Notes.Read"],
|
|
2034
2034
|
"contentType": "application/json",
|
|
2035
|
-
"llmTip": "Resolves a OneNote notebook from its web URL (the link a user copies from OneNote / SharePoint / Teams). Body: { webUrl: 'https://...' }. Returns a
|
|
2035
|
+
"llmTip": "Resolves a OneNote notebook from its web URL (the link a user copies from OneNote / SharePoint / Teams). Body: { webUrl: 'https://...' }. Returns a notebook object with id, displayName, sectionsUrl, sectionGroupsUrl, and isShared — you can then list its sections via list-onenote-notebook-sections. Accepts user notebooks, group notebooks, and SharePoint-hosted team notebooks. Personal Microsoft accounts are not supported."
|
|
2036
2036
|
},
|
|
2037
2037
|
{
|
|
2038
2038
|
"pathPattern": "/me/presence/setPresence",
|
|
@@ -2040,7 +2040,7 @@
|
|
|
2040
2040
|
"toolName": "set-my-presence",
|
|
2041
2041
|
"workScopes": ["Presence.ReadWrite"],
|
|
2042
2042
|
"contentType": "application/json",
|
|
2043
|
-
"llmTip": "Sets the user's presence session as an application. Body: { sessionId (your app's client/session id, required), availability
|
|
2043
|
+
"llmTip": "Sets the user's presence session as an application. Body: { sessionId (your app's client/session id, required), availability + activity (must be one of these documented combos: Available/Available, Busy/InACall, Busy/InAConferenceCall, Away/Away, DoNotDisturb/Presenting), expirationDuration (ISO 8601 duration like 'PT1H' — defaults to PT5M, valid range PT5M–PT4H) }. Note: if the user also wants to override their *visible* status regardless of activity, prefer set-my-user-preferred-presence. clear-my-presence ends the session."
|
|
2044
2044
|
},
|
|
2045
2045
|
{
|
|
2046
2046
|
"pathPattern": "/me/presence/clearPresence",
|
|
@@ -2056,14 +2056,15 @@
|
|
|
2056
2056
|
"toolName": "set-my-user-preferred-presence",
|
|
2057
2057
|
"workScopes": ["Presence.ReadWrite"],
|
|
2058
2058
|
"contentType": "application/json",
|
|
2059
|
-
"llmTip": "Sets the user's preferred (sticky) availability and activity — the value Teams clients display regardless of underlying activity. Body: { availability (
|
|
2059
|
+
"llmTip": "Sets the user's preferred (sticky) availability and activity — the value Teams clients display regardless of underlying activity. Body: { availability + activity (must be one of these documented combos: Available/Available, Busy/Busy, DoNotDisturb/DoNotDisturb, BeRightBack/BeRightBack, Away/Away, Offline/OffWork), expirationDuration (ISO 8601 duration like 'PT2H' — if omitted, defaults to 1 day for DoNotDisturb/Busy and 7 days for other availability values; not 'indefinite'). Requires at least one active presence session (Teams client signed in or set-my-presence call) — otherwise the user appears Offline. Use this for 'put me in Do Not Disturb for 2 hours' workflows. clear-my-user-preferred-presence reverts to actual presence."
|
|
2060
2060
|
},
|
|
2061
2061
|
{
|
|
2062
2062
|
"pathPattern": "/me/presence/clearUserPreferredPresence",
|
|
2063
2063
|
"method": "post",
|
|
2064
2064
|
"toolName": "clear-my-user-preferred-presence",
|
|
2065
2065
|
"workScopes": ["Presence.ReadWrite"],
|
|
2066
|
-
"
|
|
2066
|
+
"contentType": "application/json",
|
|
2067
|
+
"llmTip": "Clears any preferred (sticky) presence override set via set-my-user-preferred-presence. The user's visible status returns to their actual activity. Body: {} (an empty JSON object — required, not 'no body')."
|
|
2067
2068
|
},
|
|
2068
2069
|
{
|
|
2069
2070
|
"pathPattern": "/me/presence/setStatusMessage",
|
|
@@ -2093,6 +2094,6 @@
|
|
|
2093
2094
|
"toolName": "send-my-activity-notification",
|
|
2094
2095
|
"workScopes": ["TeamsActivity.Send"],
|
|
2095
2096
|
"contentType": "application/json",
|
|
2096
|
-
"llmTip": "Sends a Teams activity feed notification to the current user (the badge + entry in their Activity tab). Body: { topic: { source: 'entityUrl' | 'text', value: <Graph URL or plain text>, webUrl
|
|
2097
|
+
"llmTip": "Sends a Teams activity feed notification to the current user (the badge + entry in their Activity tab). Body: { topic: { source: 'entityUrl' | 'text', value: <Graph URL or plain text>, webUrl: <required when source='text', click-through URL> }, activityType: <must be declared in the calling Teams app's manifest, OR the reserved 'systemDefault' which provides free-form Actor+Reason text>, previewText: { content: 'short preview' }, templateParameters?: [{ name, value }] (substituted into the manifest's localized notification template), teamsAppId?: <optional disambiguator when multiple installed apps share a Microsoft Entra app ID — fetch via list-my-installed-teams-apps>, chainId?, iconId? }. Use to ping the user with 'action required' notifications from agentic workflows. See https://learn.microsoft.com/graph/teams-send-activityfeednotifications."
|
|
2097
2098
|
}
|
|
2098
2099
|
]
|
package/dist/logger.js
CHANGED
|
@@ -7,7 +7,25 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
|
7
7
|
const logsDir = process.env.MS365_MCP_LOG_DIR || path.join(os.homedir(), ".ms-365-mcp-server", "logs");
|
|
8
8
|
if (!fs.existsSync(logsDir)) {
|
|
9
9
|
fs.mkdirSync(logsDir, { recursive: true, mode: 448 });
|
|
10
|
+
} else {
|
|
11
|
+
try {
|
|
12
|
+
fs.chmodSync(logsDir, 448);
|
|
13
|
+
} catch {
|
|
14
|
+
}
|
|
10
15
|
}
|
|
16
|
+
const FILE_MODE = 384;
|
|
17
|
+
function ensureFileMode(filePath) {
|
|
18
|
+
try {
|
|
19
|
+
if (fs.existsSync(filePath)) {
|
|
20
|
+
fs.chmodSync(filePath, FILE_MODE);
|
|
21
|
+
}
|
|
22
|
+
} catch {
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const errorLogPath = path.join(logsDir, "error.log");
|
|
26
|
+
const serverLogPath = path.join(logsDir, "mcp-server.log");
|
|
27
|
+
ensureFileMode(errorLogPath);
|
|
28
|
+
ensureFileMode(serverLogPath);
|
|
11
29
|
const logger = winston.createLogger({
|
|
12
30
|
level: process.env.LOG_LEVEL || "info",
|
|
13
31
|
format: winston.format.combine(
|
|
@@ -20,11 +38,13 @@ const logger = winston.createLogger({
|
|
|
20
38
|
),
|
|
21
39
|
transports: [
|
|
22
40
|
new winston.transports.File({
|
|
23
|
-
filename:
|
|
24
|
-
level: "error"
|
|
41
|
+
filename: errorLogPath,
|
|
42
|
+
level: "error",
|
|
43
|
+
options: { flags: "a", mode: FILE_MODE }
|
|
25
44
|
}),
|
|
26
45
|
new winston.transports.File({
|
|
27
|
-
filename:
|
|
46
|
+
filename: serverLogPath,
|
|
47
|
+
options: { flags: "a", mode: FILE_MODE }
|
|
28
48
|
})
|
|
29
49
|
]
|
|
30
50
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@softeria/ms-365-mcp-server",
|
|
3
|
-
"version": "0.106.
|
|
3
|
+
"version": "0.106.2",
|
|
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
|
@@ -1883,21 +1883,21 @@
|
|
|
1883
1883
|
"toolName": "get-mail-tips",
|
|
1884
1884
|
"scopes": ["Mail.Read"],
|
|
1885
1885
|
"contentType": "application/json",
|
|
1886
|
-
"llmTip": "Looks up MailTips for one or more recipients before sending an email — answers 'is this person on auto-reply / OOF?', 'will my email exceed their mailbox quota?', 'are they an external recipient?', 'is this a mailbox or distribution list?'. Body: { EmailAddresses: ['user@contoso.com', ...]
|
|
1886
|
+
"llmTip": "Looks up MailTips for one or more recipients before sending an email — answers 'is this person on auto-reply / OOF?', 'will my email exceed their mailbox quota?', 'are they an external recipient?', 'is this a mailbox or distribution list?'. Body: { EmailAddresses: ['user@contoso.com', ...], MailTipsOptions: 'automaticReplies, mailboxFullStatus, customMailTip, externalMemberCount, totalMemberCount, maxMessageSize, deliveryRestriction, moderationStatus, recipientScope, recipientSuggestions' (comma-separated subset) }. Returns mailTips per recipient with the requested fields populated. Use this to short-circuit urgent emails when a recipient is OOF, or to warn before fanning out to a large DL."
|
|
1887
1887
|
},
|
|
1888
1888
|
{
|
|
1889
1889
|
"pathPattern": "/me/outlook/supportedTimeZones(TimeZoneStandard='{TimeZoneStandard}')",
|
|
1890
1890
|
"method": "get",
|
|
1891
1891
|
"toolName": "list-supported-time-zones",
|
|
1892
1892
|
"scopes": ["User.Read"],
|
|
1893
|
-
"llmTip": "Lists time zones the user's mailbox server supports. TimeZoneStandard path parameter must be one of:
|
|
1893
|
+
"llmTip": "Lists time zones the user's mailbox server supports. TimeZoneStandard path parameter must be one of: Windows (default — Windows time zone names like 'Pacific Standard Time'), or Iana (IANA / Olson names like 'America/Los_Angeles'). Note the PascalCase — the values are case-sensitive enums, not lowercase strings. Returns timeZoneInformation objects with alias and displayName. Use the result to validate or look up the value before calling update-mailbox-settings to change the user's preferred timeZone — the format must match what the server expects."
|
|
1894
1894
|
},
|
|
1895
1895
|
{
|
|
1896
1896
|
"pathPattern": "/me/outlook/supportedLanguages()",
|
|
1897
1897
|
"method": "get",
|
|
1898
1898
|
"toolName": "list-supported-languages",
|
|
1899
1899
|
"scopes": ["User.Read"],
|
|
1900
|
-
"llmTip": "Lists locales and languages the user's mailbox server supports for the Outlook UI and message rendering. Returns localeInfo objects with locale (e.g. 'en-US')
|
|
1900
|
+
"llmTip": "Lists locales and languages the user's mailbox server supports for the Outlook UI and message rendering. Returns localeInfo objects with locale (e.g. 'en-US') and displayName ('English (United States)'). Use this to validate the locale value before calling update-mailbox-settings to change the user's preferred language."
|
|
1901
1901
|
},
|
|
1902
1902
|
{
|
|
1903
1903
|
"pathPattern": "/me/calendar/calendarPermissions",
|
|
@@ -1939,35 +1939,35 @@
|
|
|
1939
1939
|
"method": "post",
|
|
1940
1940
|
"toolName": "create-contact-child-folder",
|
|
1941
1941
|
"scopes": ["Contacts.ReadWrite"],
|
|
1942
|
-
"llmTip": "Creates a sub-folder under an existing contact folder. Body: { displayName: 'Sub-folder name' }.
|
|
1942
|
+
"llmTip": "Creates a sub-folder under an existing contact folder. Body: { displayName: 'Sub-folder name' }. Use list-contact-folders to discover the parent id. The returned contactFolder has its own id usable with update-contact-folder, delete-contact-folder, list-contact-folder-contacts, and create-contact-in-folder — contactFolder ids are mailbox-unique regardless of nesting depth."
|
|
1943
1943
|
},
|
|
1944
1944
|
{
|
|
1945
1945
|
"pathPattern": "/me/contactFolders",
|
|
1946
1946
|
"method": "get",
|
|
1947
1947
|
"toolName": "list-contact-folders",
|
|
1948
1948
|
"scopes": ["Contacts.Read"],
|
|
1949
|
-
"llmTip": "Lists the user's Outlook contact folders (the named buckets that organize contacts). Always includes the built-in 'Contacts' folder; user-created folders also appear. Returns id, displayName,
|
|
1949
|
+
"llmTip": "Lists the user's Outlook contact folders (the named buckets that organize contacts). Always includes the built-in 'Contacts' folder; user-created folders also appear. Returns id, displayName, and parentFolderId. To identify the default folder, match displayName === 'Contacts'. Use this before list-contact-folder-contacts or create-contact-in-folder to discover folder ids. Supports OData query parameters."
|
|
1950
1950
|
},
|
|
1951
1951
|
{
|
|
1952
1952
|
"pathPattern": "/me/contactFolders",
|
|
1953
1953
|
"method": "post",
|
|
1954
1954
|
"toolName": "create-contact-folder",
|
|
1955
1955
|
"scopes": ["Contacts.ReadWrite"],
|
|
1956
|
-
"llmTip": "Creates a new contact folder under the user's mailbox root. Body: { displayName: 'Family' }. Returns the created contactFolder with its id.
|
|
1956
|
+
"llmTip": "Creates a new contact folder under the user's mailbox root. Body: { displayName: 'Family' }. Returns the created contactFolder with its id. To create a sub-folder under an existing folder, use create-contact-child-folder."
|
|
1957
1957
|
},
|
|
1958
1958
|
{
|
|
1959
1959
|
"pathPattern": "/me/contactFolders/{contactFolder-id}",
|
|
1960
1960
|
"method": "patch",
|
|
1961
1961
|
"toolName": "update-contact-folder",
|
|
1962
1962
|
"scopes": ["Contacts.ReadWrite"],
|
|
1963
|
-
"llmTip": "
|
|
1963
|
+
"llmTip": "Updates a contact folder. Body: { displayName?: 'New name', parentFolderId?: '<id>' } — both displayName (rename) and parentFolderId (move) are writable. The default 'Contacts' folder may not be renameable. Get the folder id via list-contact-folders."
|
|
1964
1964
|
},
|
|
1965
1965
|
{
|
|
1966
1966
|
"pathPattern": "/me/contactFolders/{contactFolder-id}",
|
|
1967
1967
|
"method": "delete",
|
|
1968
1968
|
"toolName": "delete-contact-folder",
|
|
1969
1969
|
"scopes": ["Contacts.ReadWrite"],
|
|
1970
|
-
"llmTip": "Deletes a contact folder
|
|
1970
|
+
"llmTip": "Deletes a contact folder. The default 'Contacts' folder cannot be deleted — Graph returns an error. The folder (and its contents) typically lands in Deleted Items rather than being permanently removed. Get the folder id via list-contact-folders."
|
|
1971
1971
|
},
|
|
1972
1972
|
{
|
|
1973
1973
|
"pathPattern": "/me/contactFolders/{contactFolder-id}/contacts",
|
|
@@ -2010,14 +2010,14 @@
|
|
|
2010
2010
|
"method": "delete",
|
|
2011
2011
|
"toolName": "delete-todo-task-list",
|
|
2012
2012
|
"scopes": ["Tasks.ReadWrite"],
|
|
2013
|
-
"llmTip": "Deletes a Microsoft To Do task list
|
|
2013
|
+
"llmTip": "Deletes a Microsoft To Do task list. Built-in lists (Flagged emails, the default Tasks list) cannot be deleted — the API returns an error for those. Get list ids via list-todo-task-lists."
|
|
2014
2014
|
},
|
|
2015
2015
|
{
|
|
2016
2016
|
"pathPattern": "/me/onenote/pages",
|
|
2017
2017
|
"method": "get",
|
|
2018
2018
|
"toolName": "list-onenote-pages",
|
|
2019
2019
|
"scopes": ["Notes.Read"],
|
|
2020
|
-
"llmTip": "Lists all OneNote pages across every notebook and section the user has access to — transverse alternative to walking notebooks → sections → pages. Default returns top 20 ordered by lastModifiedTime desc. Supports $
|
|
2020
|
+
"llmTip": "Lists all OneNote pages across every notebook and section the user has access to — transverse alternative to walking notebooks → sections → pages. Default returns top 20 ordered by lastModifiedTime desc. Supports $filter (e.g. lastModifiedTime gt 2026-01-01, or contains(tolower(title), 'topic') for title search), $top (max 100), $select, and $expand=parentNotebook,parentSection. Use this instead of bouncing through list-onenote-notebooks / list-all-onenote-sections / list-onenote-section-pages when you have a topic in mind."
|
|
2021
2021
|
},
|
|
2022
2022
|
{
|
|
2023
2023
|
"pathPattern": "/me/onenote/sectionGroups",
|
|
@@ -2032,7 +2032,7 @@
|
|
|
2032
2032
|
"toolName": "get-onenote-notebook-from-web-url",
|
|
2033
2033
|
"workScopes": ["Notes.Read"],
|
|
2034
2034
|
"contentType": "application/json",
|
|
2035
|
-
"llmTip": "Resolves a OneNote notebook from its web URL (the link a user copies from OneNote / SharePoint / Teams). Body: { webUrl: 'https://...' }. Returns a
|
|
2035
|
+
"llmTip": "Resolves a OneNote notebook from its web URL (the link a user copies from OneNote / SharePoint / Teams). Body: { webUrl: 'https://...' }. Returns a notebook object with id, displayName, sectionsUrl, sectionGroupsUrl, and isShared — you can then list its sections via list-onenote-notebook-sections. Accepts user notebooks, group notebooks, and SharePoint-hosted team notebooks. Personal Microsoft accounts are not supported."
|
|
2036
2036
|
},
|
|
2037
2037
|
{
|
|
2038
2038
|
"pathPattern": "/me/presence/setPresence",
|
|
@@ -2040,7 +2040,7 @@
|
|
|
2040
2040
|
"toolName": "set-my-presence",
|
|
2041
2041
|
"workScopes": ["Presence.ReadWrite"],
|
|
2042
2042
|
"contentType": "application/json",
|
|
2043
|
-
"llmTip": "Sets the user's presence session as an application. Body: { sessionId (your app's client/session id, required), availability
|
|
2043
|
+
"llmTip": "Sets the user's presence session as an application. Body: { sessionId (your app's client/session id, required), availability + activity (must be one of these documented combos: Available/Available, Busy/InACall, Busy/InAConferenceCall, Away/Away, DoNotDisturb/Presenting), expirationDuration (ISO 8601 duration like 'PT1H' — defaults to PT5M, valid range PT5M–PT4H) }. Note: if the user also wants to override their *visible* status regardless of activity, prefer set-my-user-preferred-presence. clear-my-presence ends the session."
|
|
2044
2044
|
},
|
|
2045
2045
|
{
|
|
2046
2046
|
"pathPattern": "/me/presence/clearPresence",
|
|
@@ -2056,14 +2056,15 @@
|
|
|
2056
2056
|
"toolName": "set-my-user-preferred-presence",
|
|
2057
2057
|
"workScopes": ["Presence.ReadWrite"],
|
|
2058
2058
|
"contentType": "application/json",
|
|
2059
|
-
"llmTip": "Sets the user's preferred (sticky) availability and activity — the value Teams clients display regardless of underlying activity. Body: { availability (
|
|
2059
|
+
"llmTip": "Sets the user's preferred (sticky) availability and activity — the value Teams clients display regardless of underlying activity. Body: { availability + activity (must be one of these documented combos: Available/Available, Busy/Busy, DoNotDisturb/DoNotDisturb, BeRightBack/BeRightBack, Away/Away, Offline/OffWork), expirationDuration (ISO 8601 duration like 'PT2H' — if omitted, defaults to 1 day for DoNotDisturb/Busy and 7 days for other availability values; not 'indefinite'). Requires at least one active presence session (Teams client signed in or set-my-presence call) — otherwise the user appears Offline. Use this for 'put me in Do Not Disturb for 2 hours' workflows. clear-my-user-preferred-presence reverts to actual presence."
|
|
2060
2060
|
},
|
|
2061
2061
|
{
|
|
2062
2062
|
"pathPattern": "/me/presence/clearUserPreferredPresence",
|
|
2063
2063
|
"method": "post",
|
|
2064
2064
|
"toolName": "clear-my-user-preferred-presence",
|
|
2065
2065
|
"workScopes": ["Presence.ReadWrite"],
|
|
2066
|
-
"
|
|
2066
|
+
"contentType": "application/json",
|
|
2067
|
+
"llmTip": "Clears any preferred (sticky) presence override set via set-my-user-preferred-presence. The user's visible status returns to their actual activity. Body: {} (an empty JSON object — required, not 'no body')."
|
|
2067
2068
|
},
|
|
2068
2069
|
{
|
|
2069
2070
|
"pathPattern": "/me/presence/setStatusMessage",
|
|
@@ -2093,6 +2094,6 @@
|
|
|
2093
2094
|
"toolName": "send-my-activity-notification",
|
|
2094
2095
|
"workScopes": ["TeamsActivity.Send"],
|
|
2095
2096
|
"contentType": "application/json",
|
|
2096
|
-
"llmTip": "Sends a Teams activity feed notification to the current user (the badge + entry in their Activity tab). Body: { topic: { source: 'entityUrl' | 'text', value: <Graph URL or plain text>, webUrl
|
|
2097
|
+
"llmTip": "Sends a Teams activity feed notification to the current user (the badge + entry in their Activity tab). Body: { topic: { source: 'entityUrl' | 'text', value: <Graph URL or plain text>, webUrl: <required when source='text', click-through URL> }, activityType: <must be declared in the calling Teams app's manifest, OR the reserved 'systemDefault' which provides free-form Actor+Reason text>, previewText: { content: 'short preview' }, templateParameters?: [{ name, value }] (substituted into the manifest's localized notification template), teamsAppId?: <optional disambiguator when multiple installed apps share a Microsoft Entra app ID — fetch via list-my-installed-teams-apps>, chainId?, iconId? }. Use to ping the user with 'action required' notifications from agentic workflows. See https://learn.microsoft.com/graph/teams-send-activityfeednotifications."
|
|
2097
2098
|
}
|
|
2098
2099
|
]
|