This commit is contained in:
2026-07-10 16:56:16 +03:00
parent 979e974521
commit afa2bf5126
6 changed files with 18 additions and 9 deletions
+4 -2
View File
@@ -17,7 +17,8 @@ export function registerAuthTools(server: McpServer): void {
description: "Authenticate to Exchange EWS using NTLM credentials." description: "Authenticate to Exchange EWS using NTLM credentials."
+ " On first use all fields except domain are required." + " On first use all fields except domain are required."
+ " On subsequent logins only password is needed — previously saved" + " On subsequent logins only password is needed — previously saved"
+ " serverUrl, email, username, and domain are reused automatically from config.", + " serverUrl, email, username, and domain are reused"
+ " automatically from config.",
inputSchema: z.object({ inputSchema: z.object({
serverUrl: z.string().optional().describe("EWS server URL"), serverUrl: z.string().optional().describe("EWS server URL"),
email: z.string().optional().describe("Email address"), email: z.string().optional().describe("Email address"),
@@ -176,7 +177,8 @@ export function registerAuthTools(server: McpServer): void {
"logout", "logout",
{ {
description: description:
"Clear stored credentials (serverUrl, email, username, domain, password). No parameters.", "Clear stored credentials (serverUrl, email, username, domain, password)."
+ " No parameters.",
inputSchema: z.object({}), inputSchema: z.object({}),
outputSchema: z.object({ outputSchema: z.object({
success: z.boolean(), success: z.boolean(),
+2 -1
View File
@@ -108,7 +108,8 @@ export function registerAvailabilityTools(server: McpServer): void {
"find_meeting_time", "find_meeting_time",
{ {
description: "Find common free time for multiple attendees." description: "Find common free time for multiple attendees."
+ " Queries free/busy for all attendees and returns slots where everyone is available.", + " Queries free/busy for all attendees"
+ " and returns slots where everyone is available.",
inputSchema: z.object({ inputSchema: z.object({
emails: z.string().describe( emails: z.string().describe(
"Comma-separated email addresses of attendees", "Comma-separated email addresses of attendees",
+4 -2
View File
@@ -14,7 +14,8 @@ export function registerCalendarTools(server: McpServer): void {
startDate: z.string().describe("Start date in YYYY-MM-DD format"), startDate: z.string().describe("Start date in YYYY-MM-DD format"),
endDate: z.string().describe("End date in YYYY-MM-DD format"), endDate: z.string().describe("End date in YYYY-MM-DD format"),
includeBody: z.boolean().default(false).describe( includeBody: z.boolean().default(false).describe(
"If true, fetch full event details (organizer, attendees, body) via GetItem", "If true, fetch full event details (organizer, attendees, body)"
+ " via GetItem",
), ),
}), }),
outputSchema: z.object({ outputSchema: z.object({
@@ -107,7 +108,8 @@ export function registerCalendarTools(server: McpServer): void {
{ {
description: description:
"Download all file attachments from a calendar event to disk." "Download all file attachments from a calendar event to disk."
+ " Inline (embedded) attachments are skipped — only standalone file attachments are downloaded.", + " Inline (embedded) attachments are skipped —"
+ " only standalone file attachments are downloaded.",
inputSchema: z.object({ inputSchema: z.object({
itemId: z.string().describe( itemId: z.string().describe(
"The Exchange ItemId of the calendar event", "The Exchange ItemId of the calendar event",
+4 -2
View File
@@ -16,7 +16,8 @@ export function registerEmailTools(server: McpServer): void {
+ " Supports optional text search via query/queryScope.", + " Supports optional text search via query/queryScope.",
inputSchema: z.object({ inputSchema: z.object({
folder: z.string().default("Inbox").describe( folder: z.string().default("Inbox").describe(
"Folder name (Inbox, Sent, Drafts, Deleted, Junk, or custom). Supports Russian folder names", "Folder name (Inbox, Sent, Drafts, Deleted, Junk, or custom)."
+ " Supports Russian folder names",
), ),
limit: z.number().default(10).describe( limit: z.number().default(10).describe(
"Maximum number of emails to return", "Maximum number of emails to return",
@@ -297,7 +298,8 @@ export function registerEmailTools(server: McpServer): void {
"download_attachments", "download_attachments",
{ {
description: "Download all file attachments from an email to disk." description: "Download all file attachments from an email to disk."
+ " Inline (embedded) attachments are skipped — only standalone file attachments are downloaded.", + " Inline (embedded) attachments are skipped —"
+ " only standalone file attachments are downloaded.",
inputSchema: z.object({ inputSchema: z.object({
itemId: z.string().describe("The Exchange ItemId of the email"), itemId: z.string().describe("The Exchange ItemId of the email"),
targetFolder: z.string().default("/tmp/attachments").describe( targetFolder: z.string().default("/tmp/attachments").describe(
+2 -1
View File
@@ -9,7 +9,8 @@ export function registerFolderTools(server: McpServer): void {
description: "List mailbox folders from the Exchange mailbox.", description: "List mailbox folders from the Exchange mailbox.",
inputSchema: z.object({ inputSchema: z.object({
parentFolderId: z.string().default("msgfolderroot").describe( parentFolderId: z.string().default("msgfolderroot").describe(
"Parent folder to list children of. Supports distinguished names (e.g. inbox, calendar)", "Parent folder to list children of."
+ " Supports distinguished names (e.g. inbox, calendar)",
), ),
recursive: z.boolean().default(false).describe( recursive: z.boolean().default(false).describe(
"If true, recursively traverse all subfolders", "If true, recursively traverse all subfolders",
+2 -1
View File
@@ -7,7 +7,8 @@ export function registerPeopleTools(server: McpServer): void {
"find_person", "find_person",
{ {
description: description:
"Search for people in the corporate directory (Active Directory) by name, email, or keyword.", "Search for people in the corporate directory (Active Directory)"
+ " by name, email, or keyword.",
inputSchema: z.object({ inputSchema: z.object({
query: z.string().describe( query: z.string().describe(
"Name, email address, or keyword to search for", "Name, email address, or keyword to search for",