From d2de7688781b0f9eb75a409c47c50502b5d05cf8 Mon Sep 17 00:00:00 2001 From: albnnc Date: Thu, 9 Jul 2026 16:54:31 +0300 Subject: [PATCH] feat: easier login --- SKILL.md | 13 +++++++++---- tools/auth.ts | 39 +++++++++++++++++++++++++++++++-------- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/SKILL.md b/SKILL.md index 37e11ed..3a8008b 100644 --- a/SKILL.md +++ b/SKILL.md @@ -31,16 +31,21 @@ Gmail, Outlook.com. #### `login` -Authenticate to Exchange EWS via NTLM. +Authenticate to Exchange EWS via NTLM. On first use, all fields except `domain` +are required. On subsequent logins, only `password` is needed — previously saved +`serverUrl`, `email`, `username`, and `domain` are reused automatically. | Parameter | Type | Required | Description | | ----------- | ------ | -------- | ------------------------------------------------ | -| `serverUrl` | string | yes | EWS server URL (e.g. `https://mail.example.com`) | -| `email` | string | yes | Email address | -| `username` | string | yes | NTLM username | +| `serverUrl` | string | no* | EWS server URL (e.g. `https://mail.example.com`) | +| `email` | string | no* | Email address | +| `username` | string | no* | NTLM username | | `password` | string | yes | NTLM password | | `domain` | string | no | NTLM domain (default: `corp`) | +\* Required only on first login; skipped on subsequent logins (loaded from saved +config). + #### `check_session` Check if the current session is authenticated. No parameters. Returns diff --git a/tools/auth.ts b/tools/auth.ts index b566d3c..df23bc1 100644 --- a/tools/auth.ts +++ b/tools/auth.ts @@ -8,6 +8,7 @@ import { saveConfig, setPassword, } from "../ews_client.ts"; +import type { LoginConfig } from "../types/login_config.ts"; export function registerAuthTools(server: McpServer): void { server.registerTool( @@ -15,24 +16,46 @@ export function registerAuthTools(server: McpServer): void { { description: "Authenticate to Exchange EWS using NTLM credentials", inputSchema: z.object({ - serverUrl: z.string().describe( + serverUrl: z.string().optional().describe( "EWS server URL (e.g. https://mail.example.com)", ), - email: z.string().describe("Email address"), - username: z.string().describe("NTLM username"), + email: z.string().optional().describe("Email address"), + username: z.string().optional().describe("NTLM username"), password: z.string().describe("NTLM password"), domain: z.string().optional().describe("NTLM domain (default: corp)"), }), }, async ({ serverUrl, email, username, password, domain }) => { try { - const config = { - serverUrl: serverUrl.replace(/\/+$/, ""), - email, - username, - domain: domain ?? "corp", + let savedConfig: Partial = {}; + try { + savedConfig = loadConfig(); + } catch { + // no saved config — all fields must be provided + } + + const config: LoginConfig = { + serverUrl: (serverUrl ?? savedConfig.serverUrl)!, + email: (email ?? savedConfig.email)!, + username: (username ?? savedConfig.username)!, + domain: domain ?? savedConfig.domain ?? "corp", }; + if (!config.serverUrl || !config.email || !config.username) { + return { + content: [{ + type: "text" as const, + text: JSON.stringify({ + success: false, + error: + "Missing required fields. Provide serverUrl, email, and username, or login once with all fields first.", + }), + }], + }; + } + + config.serverUrl = config.serverUrl.replace(/\/+$/, ""); + const client = new EwsClient(config, password); const result = await client.verifyConnection();