msoutlook-mcp 0.1.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/README.md +134 -0
- package/dist/api/calendar.d.ts +90 -0
- package/dist/api/calendar.d.ts.map +1 -0
- package/dist/api/calendar.js +102 -0
- package/dist/api/calendar.js.map +1 -0
- package/dist/api/client.d.ts +14 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +93 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/contacts.d.ts +43 -0
- package/dist/api/contacts.d.ts.map +1 -0
- package/dist/api/contacts.js +45 -0
- package/dist/api/contacts.js.map +1 -0
- package/dist/api/mail.d.ts +90 -0
- package/dist/api/mail.d.ts.map +1 -0
- package/dist/api/mail.js +148 -0
- package/dist/api/mail.js.map +1 -0
- package/dist/api/people.d.ts +28 -0
- package/dist/api/people.d.ts.map +1 -0
- package/dist/api/people.js +16 -0
- package/dist/api/people.js.map +1 -0
- package/dist/auth/browser-login.d.ts +26 -0
- package/dist/auth/browser-login.d.ts.map +1 -0
- package/dist/auth/browser-login.js +398 -0
- package/dist/auth/browser-login.js.map +1 -0
- package/dist/auth/index.d.ts +34 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +89 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/session-store.d.ts +38 -0
- package/dist/auth/session-store.d.ts.map +1 -0
- package/dist/auth/session-store.js +163 -0
- package/dist/auth/session-store.js.map +1 -0
- package/dist/auth/token-extractor.d.ts +46 -0
- package/dist/auth/token-extractor.d.ts.map +1 -0
- package/dist/auth/token-extractor.js +126 -0
- package/dist/auth/token-extractor.js.map +1 -0
- package/dist/auth/token-refresh.d.ts +23 -0
- package/dist/auth/token-refresh.d.ts.map +1 -0
- package/dist/auth/token-refresh.js +133 -0
- package/dist/auth/token-refresh.js.map +1 -0
- package/dist/browser/cookie-import.d.ts +30 -0
- package/dist/browser/cookie-import.d.ts.map +1 -0
- package/dist/browser/cookie-import.js +446 -0
- package/dist/browser/cookie-import.js.map +1 -0
- package/dist/constants.d.ts +27 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +39 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/auth-tools.d.ts +6 -0
- package/dist/tools/auth-tools.d.ts.map +1 -0
- package/dist/tools/auth-tools.js +116 -0
- package/dist/tools/auth-tools.js.map +1 -0
- package/dist/tools/calendar-tools.d.ts +6 -0
- package/dist/tools/calendar-tools.d.ts.map +1 -0
- package/dist/tools/calendar-tools.js +168 -0
- package/dist/tools/calendar-tools.js.map +1 -0
- package/dist/tools/contact-tools.d.ts +6 -0
- package/dist/tools/contact-tools.d.ts.map +1 -0
- package/dist/tools/contact-tools.js +105 -0
- package/dist/tools/contact-tools.js.map +1 -0
- package/dist/tools/mail-tools.d.ts +6 -0
- package/dist/tools/mail-tools.d.ts.map +1 -0
- package/dist/tools/mail-tools.js +196 -0
- package/dist/tools/mail-tools.js.map +1 -0
- package/dist/utils/http.d.ts +15 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +48 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +21 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mail-tools.d.ts","sourceRoot":"","sources":["../../src/tools/mail-tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6DzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkPzD"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email MCP tools.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { listMessages, getMessage, sendEmail, createDraft, replyToMessage, forwardMessage, markMessageRead, flagMessage, moveMessage, deleteMessage, searchMessages, listFolders, getUnreadMessages, sendDraft, } from '../api/mail.js';
|
|
6
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
7
|
+
// Formatters
|
|
8
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
9
|
+
function formatMessage(m, full = false) {
|
|
10
|
+
const from = m.From?.EmailAddress
|
|
11
|
+
? `${m.From.EmailAddress.Name ?? ''} <${m.From.EmailAddress.Address}>`
|
|
12
|
+
: 'Unknown';
|
|
13
|
+
const to = m.ToRecipients?.map(r => r.EmailAddress.Address).join(', ') ?? '';
|
|
14
|
+
const date = m.ReceivedDateTime ?? m.SentDateTime ?? '';
|
|
15
|
+
const lines = [
|
|
16
|
+
`ID: ${m.Id}`,
|
|
17
|
+
`Subject: ${m.Subject}`,
|
|
18
|
+
`From: ${from}`,
|
|
19
|
+
`To: ${to}`,
|
|
20
|
+
`Date: ${date}`,
|
|
21
|
+
`Read: ${m.IsRead ? 'Yes' : 'No'}`,
|
|
22
|
+
`Has Attachments: ${m.HasAttachments ? 'Yes' : 'No'}`,
|
|
23
|
+
m.Flag?.FlagStatus !== 'NotFlagged' ? `Flag: ${m.Flag?.FlagStatus}` : '',
|
|
24
|
+
m.WebLink ? `Web URL: ${m.WebLink}` : '',
|
|
25
|
+
].filter(Boolean);
|
|
26
|
+
if (full && m.Body) {
|
|
27
|
+
lines.push('', `Body (${m.Body.ContentType}):`, m.Body.Content.slice(0, 5000));
|
|
28
|
+
}
|
|
29
|
+
else if (m.BodyPreview) {
|
|
30
|
+
lines.push(`Preview: ${m.BodyPreview}`);
|
|
31
|
+
}
|
|
32
|
+
return lines.join('\n');
|
|
33
|
+
}
|
|
34
|
+
function formatMessageList(messages) {
|
|
35
|
+
if (messages.length === 0)
|
|
36
|
+
return 'No messages found.';
|
|
37
|
+
return messages.map((m, i) => `--- Message ${i + 1} ---\n${formatMessage(m)}`).join('\n\n');
|
|
38
|
+
}
|
|
39
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
40
|
+
// Tools
|
|
41
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
42
|
+
export function registerMailTools(server) {
|
|
43
|
+
// ── outlook_list_emails ──────────────────────────────────────────────────
|
|
44
|
+
server.tool('outlook_list_emails', 'List emails from a mail folder. Defaults to Inbox, newest first.', {
|
|
45
|
+
folder: z.string().optional().describe('Folder name or ID. Defaults to Inbox. Common values: Inbox, Drafts, SentItems, DeletedItems, Archive, JunkEmail'),
|
|
46
|
+
top: z.number().int().min(1).max(100).optional().describe('Number of emails to return (default 20, max 100)'),
|
|
47
|
+
unread_only: z.boolean().optional().describe('If true, return only unread emails'),
|
|
48
|
+
mark_read: z.boolean().optional().describe('If true, mark fetched emails as read. Default: false'),
|
|
49
|
+
}, async ({ folder, top, unread_only, mark_read }) => {
|
|
50
|
+
const messages = await listMessages({
|
|
51
|
+
folder: folder ?? 'Inbox',
|
|
52
|
+
top: top ?? 20,
|
|
53
|
+
filter: unread_only ? 'IsRead eq false' : undefined,
|
|
54
|
+
});
|
|
55
|
+
if (mark_read) {
|
|
56
|
+
await Promise.all(messages.map(m => markMessageRead(m.Id)));
|
|
57
|
+
}
|
|
58
|
+
return { content: [{ type: 'text', text: formatMessageList(messages) }] };
|
|
59
|
+
});
|
|
60
|
+
// ── outlook_get_email ────────────────────────────────────────────────────
|
|
61
|
+
server.tool('outlook_get_email', 'Read the full content of a specific email by ID.', {
|
|
62
|
+
id: z.string().describe('The email message ID (from outlook_list_emails)'),
|
|
63
|
+
include_attachments: z.boolean().optional().describe('Include attachment metadata (default: false)'),
|
|
64
|
+
mark_read: z.boolean().optional().describe('Mark as read when fetching (default: false)'),
|
|
65
|
+
}, async ({ id, include_attachments, mark_read }) => {
|
|
66
|
+
const message = await getMessage(id, include_attachments ?? false);
|
|
67
|
+
if (mark_read && !message.IsRead) {
|
|
68
|
+
await markMessageRead(id);
|
|
69
|
+
}
|
|
70
|
+
let text = formatMessage(message, true);
|
|
71
|
+
if (include_attachments && message.Attachments?.length) {
|
|
72
|
+
text += '\n\nAttachments:\n';
|
|
73
|
+
text += message.Attachments.map(a => `- ${a.Name} (${a.ContentType}, ${Math.round(a.Size / 1024)}KB)`).join('\n');
|
|
74
|
+
}
|
|
75
|
+
return { content: [{ type: 'text', text }] };
|
|
76
|
+
});
|
|
77
|
+
// ── outlook_get_unread ───────────────────────────────────────────────────
|
|
78
|
+
server.tool('outlook_get_unread', 'Get a list of unread emails from the Inbox.', {
|
|
79
|
+
top: z.number().int().min(1).max(50).optional().describe('Number to return (default 10)'),
|
|
80
|
+
}, async ({ top }) => {
|
|
81
|
+
const messages = await getUnreadMessages(top ?? 10);
|
|
82
|
+
const count = messages.length;
|
|
83
|
+
const header = `${count} unread email${count !== 1 ? 's' : ''}:\n\n`;
|
|
84
|
+
return { content: [{ type: 'text', text: header + formatMessageList(messages) }] };
|
|
85
|
+
});
|
|
86
|
+
// ── outlook_send_email ───────────────────────────────────────────────────
|
|
87
|
+
server.tool('outlook_send_email', 'Send an email. Always confirm content with the user before calling this tool.', {
|
|
88
|
+
to: z.array(z.string().email()).describe('List of recipient email addresses'),
|
|
89
|
+
cc: z.array(z.string().email()).optional().describe('CC recipients'),
|
|
90
|
+
bcc: z.array(z.string().email()).optional().describe('BCC recipients'),
|
|
91
|
+
subject: z.string().describe('Email subject'),
|
|
92
|
+
body: z.string().describe('Email body text'),
|
|
93
|
+
body_type: z.enum(['Text', 'HTML']).optional().describe('Body format: Text or HTML (default: Text)'),
|
|
94
|
+
importance: z.enum(['Low', 'Normal', 'High']).optional().describe('Email importance (default: Normal)'),
|
|
95
|
+
}, async ({ to, cc, bcc, subject, body, body_type, importance }) => {
|
|
96
|
+
await sendEmail({
|
|
97
|
+
to,
|
|
98
|
+
cc,
|
|
99
|
+
bcc,
|
|
100
|
+
subject,
|
|
101
|
+
body,
|
|
102
|
+
bodyType: body_type,
|
|
103
|
+
importance,
|
|
104
|
+
});
|
|
105
|
+
return { content: [{ type: 'text', text: `Email sent to ${to.join(', ')}.` }] };
|
|
106
|
+
});
|
|
107
|
+
// ── outlook_create_draft ─────────────────────────────────────────────────
|
|
108
|
+
server.tool('outlook_create_draft', 'Create a draft email without sending it.', {
|
|
109
|
+
to: z.array(z.string().email()).describe('Recipient email addresses'),
|
|
110
|
+
cc: z.array(z.string().email()).optional().describe('CC recipients'),
|
|
111
|
+
subject: z.string().describe('Email subject'),
|
|
112
|
+
body: z.string().describe('Email body'),
|
|
113
|
+
body_type: z.enum(['Text', 'HTML']).optional().describe('Body format (default: Text)'),
|
|
114
|
+
}, async ({ to, cc, subject, body, body_type }) => {
|
|
115
|
+
const draft = await createDraft({ to, cc, subject, body, bodyType: body_type });
|
|
116
|
+
return {
|
|
117
|
+
content: [{
|
|
118
|
+
type: 'text',
|
|
119
|
+
text: `Draft created.\nID: ${draft.Id}\nSubject: ${draft.Subject}\nTo: ${to.join(', ')}`,
|
|
120
|
+
}],
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
// ── outlook_send_draft ───────────────────────────────────────────────────
|
|
124
|
+
server.tool('outlook_send_draft', 'Send a previously created draft email by its ID.', {
|
|
125
|
+
id: z.string().describe('Draft message ID'),
|
|
126
|
+
}, async ({ id }) => {
|
|
127
|
+
await sendDraft(id);
|
|
128
|
+
return { content: [{ type: 'text', text: 'Draft sent successfully.' }] };
|
|
129
|
+
});
|
|
130
|
+
// ── outlook_reply ────────────────────────────────────────────────────────
|
|
131
|
+
server.tool('outlook_reply', 'Reply to an email.', {
|
|
132
|
+
id: z.string().describe('Message ID to reply to'),
|
|
133
|
+
body: z.string().describe('Reply body text'),
|
|
134
|
+
reply_all: z.boolean().optional().describe('If true, reply to all recipients (default: false)'),
|
|
135
|
+
}, async ({ id, body, reply_all }) => {
|
|
136
|
+
await replyToMessage(id, body, reply_all ?? false);
|
|
137
|
+
return { content: [{ type: 'text', text: 'Reply sent.' }] };
|
|
138
|
+
});
|
|
139
|
+
// ── outlook_forward ──────────────────────────────────────────────────────
|
|
140
|
+
server.tool('outlook_forward', 'Forward an email to one or more recipients.', {
|
|
141
|
+
id: z.string().describe('Message ID to forward'),
|
|
142
|
+
to: z.array(z.string().email()).describe('Forward to these addresses'),
|
|
143
|
+
comment: z.string().optional().describe('Optional message to include with the forward'),
|
|
144
|
+
}, async ({ id, to, comment }) => {
|
|
145
|
+
await forwardMessage(id, to, comment);
|
|
146
|
+
return { content: [{ type: 'text', text: `Forwarded to ${to.join(', ')}.` }] };
|
|
147
|
+
});
|
|
148
|
+
// ── outlook_mark_read ────────────────────────────────────────────────────
|
|
149
|
+
server.tool('outlook_mark_read', 'Mark an email as read or unread.', {
|
|
150
|
+
id: z.string().describe('Message ID'),
|
|
151
|
+
is_read: z.boolean().describe('True to mark as read, false to mark as unread'),
|
|
152
|
+
}, async ({ id, is_read }) => {
|
|
153
|
+
await markMessageRead(id, is_read);
|
|
154
|
+
return { content: [{ type: 'text', text: `Message marked as ${is_read ? 'read' : 'unread'}.` }] };
|
|
155
|
+
});
|
|
156
|
+
// ── outlook_flag ─────────────────────────────────────────────────────────
|
|
157
|
+
server.tool('outlook_flag', 'Flag or unflag an email.', {
|
|
158
|
+
id: z.string().describe('Message ID'),
|
|
159
|
+
status: z.enum(['Flagged', 'Complete', 'NotFlagged']).describe('Flag status to set'),
|
|
160
|
+
}, async ({ id, status }) => {
|
|
161
|
+
await flagMessage(id, status);
|
|
162
|
+
return { content: [{ type: 'text', text: `Message flag set to: ${status}.` }] };
|
|
163
|
+
});
|
|
164
|
+
// ── outlook_move_email ───────────────────────────────────────────────────
|
|
165
|
+
server.tool('outlook_move_email', 'Move an email to a different folder.', {
|
|
166
|
+
id: z.string().describe('Message ID to move'),
|
|
167
|
+
destination_folder: z.string().describe('Destination folder name or ID (e.g. Archive, DeletedItems, Inbox, or a folder ID)'),
|
|
168
|
+
}, async ({ id, destination_folder }) => {
|
|
169
|
+
const moved = await moveMessage(id, destination_folder);
|
|
170
|
+
return { content: [{ type: 'text', text: `Message moved to ${destination_folder}.\nNew ID: ${moved.Id}` }] };
|
|
171
|
+
});
|
|
172
|
+
// ── outlook_delete_email ─────────────────────────────────────────────────
|
|
173
|
+
server.tool('outlook_delete_email', 'Delete an email (moves to Deleted Items).', {
|
|
174
|
+
id: z.string().describe('Message ID to delete'),
|
|
175
|
+
}, async ({ id }) => {
|
|
176
|
+
await deleteMessage(id);
|
|
177
|
+
return { content: [{ type: 'text', text: 'Message deleted.' }] };
|
|
178
|
+
});
|
|
179
|
+
// ── outlook_search_emails ────────────────────────────────────────────────
|
|
180
|
+
server.tool('outlook_search_emails', 'Search emails by keyword across subject and body.', {
|
|
181
|
+
query: z.string().describe('Search query (keywords, sender name, subject, etc.)'),
|
|
182
|
+
top: z.number().int().min(1).max(50).optional().describe('Max results (default 20)'),
|
|
183
|
+
}, async ({ query, top }) => {
|
|
184
|
+
const messages = await searchMessages(query, top ?? 20);
|
|
185
|
+
return { content: [{ type: 'text', text: formatMessageList(messages) }] };
|
|
186
|
+
});
|
|
187
|
+
// ── outlook_list_folders ─────────────────────────────────────────────────
|
|
188
|
+
server.tool('outlook_list_folders', 'List all mail folders with unread counts.', {}, async () => {
|
|
189
|
+
const folders = await listFolders();
|
|
190
|
+
const text = folders
|
|
191
|
+
.map(f => `${f.DisplayName} (ID: ${f.Id}) — Unread: ${f.UnreadItemCount} / ${f.TotalItemCount}`)
|
|
192
|
+
.join('\n');
|
|
193
|
+
return { content: [{ type: 'text', text: text || 'No folders found.' }] };
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=mail-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mail-tools.js","sourceRoot":"","sources":["../../src/tools/mail-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP utility helpers.
|
|
3
|
+
*/
|
|
4
|
+
export declare function getBearerHeaders(token: string, origin?: string): Record<string, string>;
|
|
5
|
+
/**
|
|
6
|
+
* Parse a fetch Response, throwing on non-2xx.
|
|
7
|
+
* JSON bodies are parsed; empty/non-JSON bodies (e.g. 202/204 from sendmail)
|
|
8
|
+
* resolve to undefined.
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseResponse<T>(res: Response): Promise<T>;
|
|
11
|
+
/** Sleep for ms milliseconds. */
|
|
12
|
+
export declare const sleep: (ms: number) => Promise<void>;
|
|
13
|
+
/** Retry a fetch operation with exponential backoff on 429/503/504. */
|
|
14
|
+
export declare function fetchWithRetry(url: string, init: RequestInit, maxAttempts?: number): Promise<Response>;
|
|
15
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,SAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQzF;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAUhE;AAED,iCAAiC;AACjC,eAAO,MAAM,KAAK,GAAI,IAAI,MAAM,kBAA8C,CAAC;AAE/E,uEAAuE;AACvE,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,WAAW,SAAI,GACd,OAAO,CAAC,QAAQ,CAAC,CAcnB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP utility helpers.
|
|
3
|
+
*/
|
|
4
|
+
import { OWA_BASE, OWA_USER_AGENT } from '../constants.js';
|
|
5
|
+
export function getBearerHeaders(token, origin = OWA_BASE) {
|
|
6
|
+
return {
|
|
7
|
+
Authorization: `Bearer ${token}`,
|
|
8
|
+
'Content-Type': 'application/json',
|
|
9
|
+
Accept: 'application/json',
|
|
10
|
+
Origin: origin,
|
|
11
|
+
'User-Agent': OWA_USER_AGENT,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Parse a fetch Response, throwing on non-2xx.
|
|
16
|
+
* JSON bodies are parsed; empty/non-JSON bodies (e.g. 202/204 from sendmail)
|
|
17
|
+
* resolve to undefined.
|
|
18
|
+
*/
|
|
19
|
+
export async function parseResponse(res) {
|
|
20
|
+
if (!res.ok) {
|
|
21
|
+
const text = await res.text().catch(() => '');
|
|
22
|
+
throw new Error(`HTTP ${res.status} ${res.statusText}: ${text.slice(0, 300)}`);
|
|
23
|
+
}
|
|
24
|
+
const ct = res.headers.get('content-type') ?? '';
|
|
25
|
+
if (ct.includes('application/json')) {
|
|
26
|
+
return res.json();
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
/** Sleep for ms milliseconds. */
|
|
31
|
+
export const sleep = (ms) => new Promise(r => setTimeout(r, ms));
|
|
32
|
+
/** Retry a fetch operation with exponential backoff on 429/503/504. */
|
|
33
|
+
export async function fetchWithRetry(url, init, maxAttempts = 3) {
|
|
34
|
+
let lastError = null;
|
|
35
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
36
|
+
const res = await fetch(url, init);
|
|
37
|
+
if (res.status === 429 || res.status === 503 || res.status === 504) {
|
|
38
|
+
const retryAfter = parseInt(res.headers.get('Retry-After') ?? '1', 10);
|
|
39
|
+
const delay = (retryAfter || Math.pow(2, attempt)) * 1000 + Math.random() * 500;
|
|
40
|
+
await sleep(delay);
|
|
41
|
+
lastError = new Error(`HTTP ${res.status}`);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
return res;
|
|
45
|
+
}
|
|
46
|
+
throw lastError ?? new Error('Max retries exceeded');
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE3D,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,MAAM,GAAG,QAAQ;IAC/D,OAAO;QACL,aAAa,EAAE,UAAU,KAAK,EAAE;QAChC,cAAc,EAAE,kBAAkB;QAClC,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,cAAc;KAC7B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAI,GAAa;IAClD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACjD,IAAI,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACpC,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;IAClC,CAAC;IACD,OAAO,SAAc,CAAC;AACxB,CAAC;AAED,iCAAiC;AACjC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAE/E,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAW,EACX,IAAiB,EACjB,WAAW,GAAG,CAAC;IAEf,IAAI,SAAS,GAAiB,IAAI,CAAC;IACnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACnE,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC;YAChF,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,SAAS,GAAG,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5C,SAAS;QACX,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal logger that writes to stderr so MCP stdout stays clean.
|
|
3
|
+
*/
|
|
4
|
+
export declare const logger: {
|
|
5
|
+
info: (msg: string, ...args: unknown[]) => void;
|
|
6
|
+
debug: (msg: string, ...args: unknown[]) => void;
|
|
7
|
+
warn: (msg: string, ...args: unknown[]) => void;
|
|
8
|
+
error: (msg: string, ...args: unknown[]) => void;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,MAAM;gBACL,MAAM,WAAW,OAAO,EAAE;iBAGzB,MAAM,WAAW,OAAO,EAAE;gBAI3B,MAAM,WAAW,OAAO,EAAE;iBAGzB,MAAM,WAAW,OAAO,EAAE;CAGxC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal logger that writes to stderr so MCP stdout stays clean.
|
|
3
|
+
*/
|
|
4
|
+
const isDebug = process.env.MSOUTLOOK_DEBUG === 'true';
|
|
5
|
+
export const logger = {
|
|
6
|
+
info: (msg, ...args) => {
|
|
7
|
+
process.stderr.write(`[msoutlook-mcp] ${msg}${args.length ? ' ' + JSON.stringify(args) : ''}\n`);
|
|
8
|
+
},
|
|
9
|
+
debug: (msg, ...args) => {
|
|
10
|
+
if (!isDebug)
|
|
11
|
+
return;
|
|
12
|
+
process.stderr.write(`[msoutlook-mcp:debug] ${msg}${args.length ? ' ' + JSON.stringify(args) : ''}\n`);
|
|
13
|
+
},
|
|
14
|
+
warn: (msg, ...args) => {
|
|
15
|
+
process.stderr.write(`[msoutlook-mcp:warn] ${msg}${args.length ? ' ' + JSON.stringify(args) : ''}\n`);
|
|
16
|
+
},
|
|
17
|
+
error: (msg, ...args) => {
|
|
18
|
+
process.stderr.write(`[msoutlook-mcp:error] ${msg}${args.length ? ' ' + JSON.stringify(args) : ''}\n`);
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM,CAAC;AAEvD,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,GAAW,EAAE,GAAG,IAAe,EAAE,EAAE;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACnG,CAAC;IACD,KAAK,EAAE,CAAC,GAAW,EAAE,GAAG,IAAe,EAAE,EAAE;QACzC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACzG,CAAC;IACD,IAAI,EAAE,CAAC,GAAW,EAAE,GAAG,IAAe,EAAE,EAAE;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACxG,CAAC;IACD,KAAK,EAAE,CAAC,GAAW,EAAE,GAAG,IAAe,EAAE,EAAE;QACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACzG,CAAC;CACF,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "msoutlook-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for Microsoft Outlook web — no app registration required, uses your existing Outlook session",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"mcp",
|
|
7
|
+
"outlook",
|
|
8
|
+
"microsoft",
|
|
9
|
+
"email",
|
|
10
|
+
"calendar",
|
|
11
|
+
"model-context-protocol"
|
|
12
|
+
],
|
|
13
|
+
"author": "Shayan Khaksar <shayan.khaksar@theaccessgroup.com>",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"type": "module",
|
|
16
|
+
"main": "dist/index.js",
|
|
17
|
+
"bin": {
|
|
18
|
+
"msoutlook-mcp": "dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"prepare": "npm run build",
|
|
25
|
+
"build": "tsc",
|
|
26
|
+
"dev": "tsx src/index.ts",
|
|
27
|
+
"start": "node dist/index.js",
|
|
28
|
+
"typecheck": "tsc --noEmit"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
32
|
+
"playwright": "^1.52.0",
|
|
33
|
+
"sql.js": "^1.14.1",
|
|
34
|
+
"zod": "^3.24.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/node": "^22.0.0",
|
|
38
|
+
"@types/sql.js": "^1.4.11",
|
|
39
|
+
"tsx": "^4.19.0",
|
|
40
|
+
"typescript": "^5.7.0"
|
|
41
|
+
},
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=20.0.0"
|
|
44
|
+
},
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "https://github.com/shayanline/msoutlook-mcp.git"
|
|
48
|
+
},
|
|
49
|
+
"bugs": {
|
|
50
|
+
"url": "https://github.com/shayanline/msoutlook-mcp/issues"
|
|
51
|
+
},
|
|
52
|
+
"homepage": "https://github.com/shayanline/msoutlook-mcp#readme"
|
|
53
|
+
}
|