@jbctechsolutions/mcp-office365 2.5.1

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.
Files changed (339) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +667 -0
  3. package/dist/applescript/account-repository.d.ts +30 -0
  4. package/dist/applescript/account-repository.d.ts.map +1 -0
  5. package/dist/applescript/account-repository.js +38 -0
  6. package/dist/applescript/account-repository.js.map +1 -0
  7. package/dist/applescript/account-scripts.d.ts +21 -0
  8. package/dist/applescript/account-scripts.d.ts.map +1 -0
  9. package/dist/applescript/account-scripts.js +180 -0
  10. package/dist/applescript/account-scripts.js.map +1 -0
  11. package/dist/applescript/calendar-manager.d.ts +44 -0
  12. package/dist/applescript/calendar-manager.d.ts.map +1 -0
  13. package/dist/applescript/calendar-manager.js +92 -0
  14. package/dist/applescript/calendar-manager.js.map +1 -0
  15. package/dist/applescript/calendar-writer.d.ts +36 -0
  16. package/dist/applescript/calendar-writer.d.ts.map +1 -0
  17. package/dist/applescript/calendar-writer.js +94 -0
  18. package/dist/applescript/calendar-writer.js.map +1 -0
  19. package/dist/applescript/content-readers.d.ts +114 -0
  20. package/dist/applescript/content-readers.d.ts.map +1 -0
  21. package/dist/applescript/content-readers.js +328 -0
  22. package/dist/applescript/content-readers.js.map +1 -0
  23. package/dist/applescript/executor.d.ts +60 -0
  24. package/dist/applescript/executor.d.ts.map +1 -0
  25. package/dist/applescript/executor.js +173 -0
  26. package/dist/applescript/executor.js.map +1 -0
  27. package/dist/applescript/index.d.ts +20 -0
  28. package/dist/applescript/index.d.ts.map +1 -0
  29. package/dist/applescript/index.js +29 -0
  30. package/dist/applescript/index.js.map +1 -0
  31. package/dist/applescript/mail-sender.d.ts +38 -0
  32. package/dist/applescript/mail-sender.d.ts.map +1 -0
  33. package/dist/applescript/mail-sender.js +67 -0
  34. package/dist/applescript/mail-sender.js.map +1 -0
  35. package/dist/applescript/parser.d.ts +235 -0
  36. package/dist/applescript/parser.d.ts.map +1 -0
  37. package/dist/applescript/parser.js +496 -0
  38. package/dist/applescript/parser.js.map +1 -0
  39. package/dist/applescript/repository.d.ts +64 -0
  40. package/dist/applescript/repository.d.ts.map +1 -0
  41. package/dist/applescript/repository.js +444 -0
  42. package/dist/applescript/repository.js.map +1 -0
  43. package/dist/applescript/scripts.d.ts +265 -0
  44. package/dist/applescript/scripts.d.ts.map +1 -0
  45. package/dist/applescript/scripts.js +1483 -0
  46. package/dist/applescript/scripts.js.map +1 -0
  47. package/dist/approval/hash.d.ts +87 -0
  48. package/dist/approval/hash.d.ts.map +1 -0
  49. package/dist/approval/hash.js +102 -0
  50. package/dist/approval/hash.js.map +1 -0
  51. package/dist/approval/index.d.ts +13 -0
  52. package/dist/approval/index.d.ts.map +1 -0
  53. package/dist/approval/index.js +7 -0
  54. package/dist/approval/index.js.map +1 -0
  55. package/dist/approval/token-manager.d.ts +51 -0
  56. package/dist/approval/token-manager.d.ts.map +1 -0
  57. package/dist/approval/token-manager.js +111 -0
  58. package/dist/approval/token-manager.js.map +1 -0
  59. package/dist/approval/types.d.ts +44 -0
  60. package/dist/approval/types.d.ts.map +1 -0
  61. package/dist/approval/types.js +6 -0
  62. package/dist/approval/types.js.map +1 -0
  63. package/dist/cli.d.ts +30 -0
  64. package/dist/cli.d.ts.map +1 -0
  65. package/dist/cli.js +143 -0
  66. package/dist/cli.js.map +1 -0
  67. package/dist/config.d.ts +27 -0
  68. package/dist/config.d.ts.map +1 -0
  69. package/dist/config.js +42 -0
  70. package/dist/config.js.map +1 -0
  71. package/dist/database/connection.d.ts +77 -0
  72. package/dist/database/connection.d.ts.map +1 -0
  73. package/dist/database/connection.js +130 -0
  74. package/dist/database/connection.js.map +1 -0
  75. package/dist/database/index.d.ts +11 -0
  76. package/dist/database/index.d.ts.map +1 -0
  77. package/dist/database/index.js +11 -0
  78. package/dist/database/index.js.map +1 -0
  79. package/dist/database/queries.d.ts +93 -0
  80. package/dist/database/queries.d.ts.map +1 -0
  81. package/dist/database/queries.js +430 -0
  82. package/dist/database/queries.js.map +1 -0
  83. package/dist/database/repository.d.ts +198 -0
  84. package/dist/database/repository.d.ts.map +1 -0
  85. package/dist/database/repository.js +199 -0
  86. package/dist/database/repository.js.map +1 -0
  87. package/dist/graph/attachments.d.ts +72 -0
  88. package/dist/graph/attachments.d.ts.map +1 -0
  89. package/dist/graph/attachments.js +207 -0
  90. package/dist/graph/attachments.js.map +1 -0
  91. package/dist/graph/auth/config.d.ts +34 -0
  92. package/dist/graph/auth/config.d.ts.map +1 -0
  93. package/dist/graph/auth/config.js +78 -0
  94. package/dist/graph/auth/config.js.map +1 -0
  95. package/dist/graph/auth/device-code-flow.d.ts +55 -0
  96. package/dist/graph/auth/device-code-flow.d.ts.map +1 -0
  97. package/dist/graph/auth/device-code-flow.js +180 -0
  98. package/dist/graph/auth/device-code-flow.js.map +1 -0
  99. package/dist/graph/auth/index.d.ts +13 -0
  100. package/dist/graph/auth/index.d.ts.map +1 -0
  101. package/dist/graph/auth/index.js +13 -0
  102. package/dist/graph/auth/index.js.map +1 -0
  103. package/dist/graph/auth/token-cache.d.ts +41 -0
  104. package/dist/graph/auth/token-cache.d.ts.map +1 -0
  105. package/dist/graph/auth/token-cache.js +105 -0
  106. package/dist/graph/auth/token-cache.js.map +1 -0
  107. package/dist/graph/client/batch.d.ts +38 -0
  108. package/dist/graph/client/batch.d.ts.map +1 -0
  109. package/dist/graph/client/batch.js +33 -0
  110. package/dist/graph/client/batch.js.map +1 -0
  111. package/dist/graph/client/cache.d.ts +64 -0
  112. package/dist/graph/client/cache.d.ts.map +1 -0
  113. package/dist/graph/client/cache.js +108 -0
  114. package/dist/graph/client/cache.js.map +1 -0
  115. package/dist/graph/client/graph-client.d.ts +630 -0
  116. package/dist/graph/client/graph-client.d.ts.map +1 -0
  117. package/dist/graph/client/graph-client.js +1771 -0
  118. package/dist/graph/client/graph-client.js.map +1 -0
  119. package/dist/graph/client/index.d.ts +12 -0
  120. package/dist/graph/client/index.d.ts.map +1 -0
  121. package/dist/graph/client/index.js +12 -0
  122. package/dist/graph/client/index.js.map +1 -0
  123. package/dist/graph/content-readers.d.ts +106 -0
  124. package/dist/graph/content-readers.d.ts.map +1 -0
  125. package/dist/graph/content-readers.js +321 -0
  126. package/dist/graph/content-readers.js.map +1 -0
  127. package/dist/graph/index.d.ts +18 -0
  128. package/dist/graph/index.d.ts.map +1 -0
  129. package/dist/graph/index.js +23 -0
  130. package/dist/graph/index.js.map +1 -0
  131. package/dist/graph/mailbox-adapter.d.ts +30 -0
  132. package/dist/graph/mailbox-adapter.d.ts.map +1 -0
  133. package/dist/graph/mailbox-adapter.js +59 -0
  134. package/dist/graph/mailbox-adapter.js.map +1 -0
  135. package/dist/graph/mappers/contact-mapper.d.ts +14 -0
  136. package/dist/graph/mappers/contact-mapper.d.ts.map +1 -0
  137. package/dist/graph/mappers/contact-mapper.js +20 -0
  138. package/dist/graph/mappers/contact-mapper.js.map +1 -0
  139. package/dist/graph/mappers/email-mapper.d.ts +14 -0
  140. package/dist/graph/mappers/email-mapper.d.ts.map +1 -0
  141. package/dist/graph/mappers/email-mapper.js +44 -0
  142. package/dist/graph/mappers/email-mapper.js.map +1 -0
  143. package/dist/graph/mappers/event-mapper.d.ts +14 -0
  144. package/dist/graph/mappers/event-mapper.d.ts.map +1 -0
  145. package/dist/graph/mappers/event-mapper.js +31 -0
  146. package/dist/graph/mappers/event-mapper.js.map +1 -0
  147. package/dist/graph/mappers/folder-mapper.d.ts +22 -0
  148. package/dist/graph/mappers/folder-mapper.d.ts.map +1 -0
  149. package/dist/graph/mappers/folder-mapper.js +51 -0
  150. package/dist/graph/mappers/folder-mapper.js.map +1 -0
  151. package/dist/graph/mappers/index.d.ts +16 -0
  152. package/dist/graph/mappers/index.d.ts.map +1 -0
  153. package/dist/graph/mappers/index.js +16 -0
  154. package/dist/graph/mappers/index.js.map +1 -0
  155. package/dist/graph/mappers/task-mapper.d.ts +20 -0
  156. package/dist/graph/mappers/task-mapper.d.ts.map +1 -0
  157. package/dist/graph/mappers/task-mapper.js +27 -0
  158. package/dist/graph/mappers/task-mapper.js.map +1 -0
  159. package/dist/graph/mappers/utils.d.ts +97 -0
  160. package/dist/graph/mappers/utils.d.ts.map +1 -0
  161. package/dist/graph/mappers/utils.js +186 -0
  162. package/dist/graph/mappers/utils.js.map +1 -0
  163. package/dist/graph/repository.d.ts +1104 -0
  164. package/dist/graph/repository.d.ts.map +1 -0
  165. package/dist/graph/repository.js +2999 -0
  166. package/dist/graph/repository.js.map +1 -0
  167. package/dist/index.d.ts +21 -0
  168. package/dist/index.d.ts.map +1 -0
  169. package/dist/index.js +6052 -0
  170. package/dist/index.js.map +1 -0
  171. package/dist/parsers/html-stripper.d.ts +41 -0
  172. package/dist/parsers/html-stripper.d.ts.map +1 -0
  173. package/dist/parsers/html-stripper.js +179 -0
  174. package/dist/parsers/html-stripper.js.map +1 -0
  175. package/dist/parsers/index.d.ts +12 -0
  176. package/dist/parsers/index.d.ts.map +1 -0
  177. package/dist/parsers/index.js +12 -0
  178. package/dist/parsers/index.js.map +1 -0
  179. package/dist/parsers/olk15.d.ts +87 -0
  180. package/dist/parsers/olk15.d.ts.map +1 -0
  181. package/dist/parsers/olk15.js +368 -0
  182. package/dist/parsers/olk15.js.map +1 -0
  183. package/dist/signature.d.ts +22 -0
  184. package/dist/signature.d.ts.map +1 -0
  185. package/dist/signature.js +89 -0
  186. package/dist/signature.js.map +1 -0
  187. package/dist/tools/calendar-permissions.d.ts +79 -0
  188. package/dist/tools/calendar-permissions.d.ts.map +1 -0
  189. package/dist/tools/calendar-permissions.js +121 -0
  190. package/dist/tools/calendar-permissions.js.map +1 -0
  191. package/dist/tools/calendar.d.ts +208 -0
  192. package/dist/tools/calendar.d.ts.map +1 -0
  193. package/dist/tools/calendar.js +247 -0
  194. package/dist/tools/calendar.js.map +1 -0
  195. package/dist/tools/categories.d.ts +94 -0
  196. package/dist/tools/categories.d.ts.map +1 -0
  197. package/dist/tools/categories.js +117 -0
  198. package/dist/tools/categories.js.map +1 -0
  199. package/dist/tools/checklist-items.d.ts +89 -0
  200. package/dist/tools/checklist-items.d.ts.map +1 -0
  201. package/dist/tools/checklist-items.js +140 -0
  202. package/dist/tools/checklist-items.js.map +1 -0
  203. package/dist/tools/contacts.d.ts +94 -0
  204. package/dist/tools/contacts.d.ts.map +1 -0
  205. package/dist/tools/contacts.js +134 -0
  206. package/dist/tools/contacts.js.map +1 -0
  207. package/dist/tools/excel.d.ts +96 -0
  208. package/dist/tools/excel.d.ts.map +1 -0
  209. package/dist/tools/excel.js +165 -0
  210. package/dist/tools/excel.js.map +1 -0
  211. package/dist/tools/focused-overrides.d.ts +70 -0
  212. package/dist/tools/focused-overrides.d.ts.map +1 -0
  213. package/dist/tools/focused-overrides.js +117 -0
  214. package/dist/tools/focused-overrides.js.map +1 -0
  215. package/dist/tools/index.d.ts +22 -0
  216. package/dist/tools/index.d.ts.map +1 -0
  217. package/dist/tools/index.js +34 -0
  218. package/dist/tools/index.js.map +1 -0
  219. package/dist/tools/linked-resources.d.ts +74 -0
  220. package/dist/tools/linked-resources.d.ts.map +1 -0
  221. package/dist/tools/linked-resources.js +122 -0
  222. package/dist/tools/linked-resources.js.map +1 -0
  223. package/dist/tools/mail-rules.d.ts +98 -0
  224. package/dist/tools/mail-rules.d.ts.map +1 -0
  225. package/dist/tools/mail-rules.js +169 -0
  226. package/dist/tools/mail-rules.js.map +1 -0
  227. package/dist/tools/mail-send.d.ts +314 -0
  228. package/dist/tools/mail-send.d.ts.map +1 -0
  229. package/dist/tools/mail-send.js +555 -0
  230. package/dist/tools/mail-send.js.map +1 -0
  231. package/dist/tools/mail.d.ts +127 -0
  232. package/dist/tools/mail.d.ts.map +1 -0
  233. package/dist/tools/mail.js +311 -0
  234. package/dist/tools/mail.js.map +1 -0
  235. package/dist/tools/mailbox-organization.d.ts +301 -0
  236. package/dist/tools/mailbox-organization.d.ts.map +1 -0
  237. package/dist/tools/mailbox-organization.js +541 -0
  238. package/dist/tools/mailbox-organization.js.map +1 -0
  239. package/dist/tools/meetings.d.ts +114 -0
  240. package/dist/tools/meetings.d.ts.map +1 -0
  241. package/dist/tools/meetings.js +110 -0
  242. package/dist/tools/meetings.js.map +1 -0
  243. package/dist/tools/notes.d.ts +74 -0
  244. package/dist/tools/notes.d.ts.map +1 -0
  245. package/dist/tools/notes.js +136 -0
  246. package/dist/tools/notes.js.map +1 -0
  247. package/dist/tools/onedrive.d.ts +194 -0
  248. package/dist/tools/onedrive.d.ts.map +1 -0
  249. package/dist/tools/onedrive.js +257 -0
  250. package/dist/tools/onedrive.js.map +1 -0
  251. package/dist/tools/people.d.ts +129 -0
  252. package/dist/tools/people.d.ts.map +1 -0
  253. package/dist/tools/people.js +195 -0
  254. package/dist/tools/people.js.map +1 -0
  255. package/dist/tools/planner-visualization.d.ts +91 -0
  256. package/dist/tools/planner-visualization.d.ts.map +1 -0
  257. package/dist/tools/planner-visualization.js +192 -0
  258. package/dist/tools/planner-visualization.js.map +1 -0
  259. package/dist/tools/planner.d.ts +288 -0
  260. package/dist/tools/planner.d.ts.map +1 -0
  261. package/dist/tools/planner.js +368 -0
  262. package/dist/tools/planner.js.map +1 -0
  263. package/dist/tools/scheduling.d.ts +49 -0
  264. package/dist/tools/scheduling.d.ts.map +1 -0
  265. package/dist/tools/scheduling.js +115 -0
  266. package/dist/tools/scheduling.js.map +1 -0
  267. package/dist/tools/sharepoint.d.ts +115 -0
  268. package/dist/tools/sharepoint.d.ts.map +1 -0
  269. package/dist/tools/sharepoint.js +99 -0
  270. package/dist/tools/sharepoint.js.map +1 -0
  271. package/dist/tools/task-attachments.d.ts +74 -0
  272. package/dist/tools/task-attachments.d.ts.map +1 -0
  273. package/dist/tools/task-attachments.js +122 -0
  274. package/dist/tools/task-attachments.js.map +1 -0
  275. package/dist/tools/tasks.d.ts +74 -0
  276. package/dist/tools/tasks.d.ts.map +1 -0
  277. package/dist/tools/tasks.js +126 -0
  278. package/dist/tools/tasks.js.map +1 -0
  279. package/dist/tools/teams.d.ts +389 -0
  280. package/dist/tools/teams.d.ts.map +1 -0
  281. package/dist/tools/teams.js +546 -0
  282. package/dist/tools/teams.js.map +1 -0
  283. package/dist/types/calendar.d.ts +60 -0
  284. package/dist/types/calendar.d.ts.map +1 -0
  285. package/dist/types/calendar.js +15 -0
  286. package/dist/types/calendar.js.map +1 -0
  287. package/dist/types/contacts.d.ts +96 -0
  288. package/dist/types/contacts.d.ts.map +1 -0
  289. package/dist/types/contacts.js +41 -0
  290. package/dist/types/contacts.js.map +1 -0
  291. package/dist/types/index.d.ts +15 -0
  292. package/dist/types/index.d.ts.map +1 -0
  293. package/dist/types/index.js +16 -0
  294. package/dist/types/index.js.map +1 -0
  295. package/dist/types/mail.d.ts +108 -0
  296. package/dist/types/mail.d.ts.map +1 -0
  297. package/dist/types/mail.js +40 -0
  298. package/dist/types/mail.js.map +1 -0
  299. package/dist/types/notes.d.ts +26 -0
  300. package/dist/types/notes.d.ts.map +1 -0
  301. package/dist/types/notes.js +6 -0
  302. package/dist/types/notes.js.map +1 -0
  303. package/dist/types/tasks.d.ts +31 -0
  304. package/dist/types/tasks.d.ts.map +1 -0
  305. package/dist/types/tasks.js +6 -0
  306. package/dist/types/tasks.js.map +1 -0
  307. package/dist/utils/dates.d.ts +66 -0
  308. package/dist/utils/dates.d.ts.map +1 -0
  309. package/dist/utils/dates.js +94 -0
  310. package/dist/utils/dates.js.map +1 -0
  311. package/dist/utils/errors.d.ts +218 -0
  312. package/dist/utils/errors.d.ts.map +1 -0
  313. package/dist/utils/errors.js +306 -0
  314. package/dist/utils/errors.js.map +1 -0
  315. package/dist/utils/index.d.ts +10 -0
  316. package/dist/utils/index.d.ts.map +1 -0
  317. package/dist/utils/index.js +10 -0
  318. package/dist/utils/index.js.map +1 -0
  319. package/dist/visualization/html.d.ts +26 -0
  320. package/dist/visualization/html.d.ts.map +1 -0
  321. package/dist/visualization/html.js +306 -0
  322. package/dist/visualization/html.js.map +1 -0
  323. package/dist/visualization/markdown.d.ts +25 -0
  324. package/dist/visualization/markdown.d.ts.map +1 -0
  325. package/dist/visualization/markdown.js +186 -0
  326. package/dist/visualization/markdown.js.map +1 -0
  327. package/dist/visualization/mermaid.d.ts +25 -0
  328. package/dist/visualization/mermaid.d.ts.map +1 -0
  329. package/dist/visualization/mermaid.js +158 -0
  330. package/dist/visualization/mermaid.js.map +1 -0
  331. package/dist/visualization/svg.d.ts +25 -0
  332. package/dist/visualization/svg.d.ts.map +1 -0
  333. package/dist/visualization/svg.js +282 -0
  334. package/dist/visualization/svg.js.map +1 -0
  335. package/dist/visualization/types.d.ts +43 -0
  336. package/dist/visualization/types.d.ts.map +1 -0
  337. package/dist/visualization/types.js +34 -0
  338. package/dist/visualization/types.js.map +1 -0
  339. package/package.json +88 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 JBC Tech Solutions, LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,667 @@
1
+ # @jbctechsolutions/mcp-office365
2
+
3
+ [![npm version](https://badge.fury.io/js/%40jbctechsolutions%2Fmcp-office365.svg)](https://www.npmjs.com/package/@jbctechsolutions/mcp-office365)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+ [![Node.js Version](https://img.shields.io/node/v/@jbctechsolutions/mcp-office365)](https://nodejs.org)
6
+
7
+ MCP server for Microsoft 365 -- mail, calendar, contacts, tasks, teams, people, and planner.
8
+
9
+ A [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server that provides **181 tools** for full read/write access to Microsoft 365. Manage your emails, calendar events, contacts, tasks, notes, Teams channels and chats, people directory, and Planner boards directly through MCP.
10
+
11
+ ## Features Overview
12
+
13
+ | Category | Tools | Description |
14
+ |----------|------:|-------------|
15
+ | Mail -- Reading | 9 | Folders, search, delta sync, conversations, unread counts |
16
+ | Mail -- Sending & Drafts | 16 | Send, draft, reply, forward with two-phase approval |
17
+ | Mail -- Signatures | 2 | Email signature management |
18
+ | Mail -- Organization | 24 | Read/unread, flags, categories, importance, move, delete, batch ops |
19
+ | Mail -- Rules | 4 | Inbox rule management |
20
+ | Mail -- Categories | 4 | Master category management |
21
+ | Mail -- Focused Inbox | 4 | Focused inbox override management |
22
+ | Mail -- Settings & Auto-Replies | 4 | Automatic replies, mailbox settings |
23
+ | Mail -- Tips & Headers | 3 | Mail tips, message headers, MIME export |
24
+ | Attachments | 2 | List and download email attachments |
25
+ | Calendar -- Events | 11 | List, search, create, update, delete, RSVP, recurring instances |
26
+ | Calendar -- Groups | 2 | Calendar group management |
27
+ | Calendar -- Permissions | 4 | Calendar sharing permissions |
28
+ | Calendar -- Rooms | 2 | Room lists and meeting rooms |
29
+ | Contacts & Folders | 13 | CRUD contacts, contact folders, photos |
30
+ | Tasks & Task Lists | 13 | To Do tasks with recurrence, task lists |
31
+ | Checklist Items | 5 | Subtasks on To Do tasks |
32
+ | Linked Resources | 4 | Linked resources on To Do tasks |
33
+ | Task Attachments | 4 | File attachments on To Do tasks |
34
+ | Notes (AppleScript only) | 3 | List, read, and search Outlook notes |
35
+ | Scheduling | 2 | Free/busy availability, meeting time suggestions |
36
+ | Teams -- Channels | 8 | Channel CRUD, team members |
37
+ | Teams -- Channel Messages | 6 | Read and send channel messages with replies |
38
+ | Teams -- Chats | 6 | 1:1 and group chats, send messages |
39
+ | People & Presence | 8 | People search, org chart, presence status |
40
+ | Planner | 17 | Plans, buckets, tasks, task details with ETag |
41
+ | Accounts | 1 | List configured Exchange accounts |
42
+ | **Total** | **181** | |
43
+
44
+ ## Quick Start
45
+
46
+ ### Install and run
47
+
48
+ ```bash
49
+ npx -y @jbctechsolutions/mcp-office365
50
+ ```
51
+
52
+ By default the server uses the **Microsoft Graph API** backend (cross-platform, full read/write access).
53
+
54
+ To use the **AppleScript backend** (classic Outlook for Mac only, limited features), set the environment variable:
55
+
56
+ ```bash
57
+ USE_APPLESCRIPT=1
58
+ ```
59
+
60
+ ### Pre-authenticate (optional)
61
+
62
+ ```bash
63
+ npx @jbctechsolutions/mcp-office365 auth
64
+ npx @jbctechsolutions/mcp-office365 auth --status
65
+ npx @jbctechsolutions/mcp-office365 auth --logout
66
+ ```
67
+
68
+ ### Claude Desktop configuration
69
+
70
+ Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
71
+
72
+ **Graph API backend (default):**
73
+ ```json
74
+ {
75
+ "mcpServers": {
76
+ "office365": {
77
+ "command": "npx",
78
+ "args": ["-y", "@jbctechsolutions/mcp-office365"]
79
+ }
80
+ }
81
+ }
82
+ ```
83
+
84
+ **AppleScript backend** (macOS + classic Outlook only):
85
+ ```json
86
+ {
87
+ "mcpServers": {
88
+ "office365": {
89
+ "command": "npx",
90
+ "args": ["-y", "@jbctechsolutions/mcp-office365"],
91
+ "env": {
92
+ "USE_APPLESCRIPT": "1"
93
+ }
94
+ }
95
+ }
96
+ }
97
+ ```
98
+
99
+ ### Claude Code configuration
100
+
101
+ **Option 1: Plugin (recommended)** -- add to `~/.claude/settings.json`:
102
+
103
+ ```json
104
+ {
105
+ "extraKnownMarketplaces": {
106
+ "jbctechsolutions": {
107
+ "source": {
108
+ "source": "github",
109
+ "repo": "jbctechsolutions/mcp-office365"
110
+ }
111
+ }
112
+ },
113
+ "enabledPlugins": {
114
+ "office365@jbctechsolutions": true
115
+ }
116
+ }
117
+ ```
118
+
119
+ **Option 2: Manual** -- add `.mcp.json` to your project or `~/.claude/.mcp.json` globally:
120
+
121
+ ```json
122
+ {
123
+ "mcpServers": {
124
+ "office365": {
125
+ "command": "npx",
126
+ "args": ["-y", "@jbctechsolutions/mcp-office365"]
127
+ }
128
+ }
129
+ }
130
+ ```
131
+
132
+ ## Authentication
133
+
134
+ ### Device Code Flow (Graph API)
135
+
136
+ 1. The server displays a device code and URL
137
+ 2. Visit https://microsoft.com/devicelogin
138
+ 3. Enter the code and sign in with your Microsoft account
139
+ 4. Grant the requested permissions
140
+
141
+ Tokens are stored in `~/.outlook-mcp/tokens.json` and refreshed automatically.
142
+
143
+ ### Custom Azure AD App Registration
144
+
145
+ For production, work accounts with conditional access, or full control over the app lifecycle:
146
+
147
+ 1. **Register** in [Azure Portal](https://portal.azure.com) > Azure Active Directory > App registrations > New registration
148
+ - Name: `Outlook MCP Server`
149
+ - Supported account types: Multitenant + personal accounts
150
+ - Redirect URI: leave blank
151
+ 2. **Add API permissions** (Microsoft Graph > Delegated): see [Required Graph API Permissions](#required-graph-api-permissions) below
152
+ 3. **Enable public client flows**: Authentication > Advanced settings > Allow public client flows > Yes
153
+ 4. **Configure** with environment variables:
154
+
155
+ ```json
156
+ {
157
+ "mcpServers": {
158
+ "office365": {
159
+ "command": "npx",
160
+ "args": ["-y", "@jbctechsolutions/mcp-office365"],
161
+ "env": {
162
+ "OUTLOOK_MCP_CLIENT_ID": "your-client-id-here",
163
+ "OUTLOOK_MCP_TENANT_ID": "common"
164
+ }
165
+ }
166
+ }
167
+ }
168
+ ```
169
+
170
+ **Tenant options:** `common` (all accounts), `organizations` (work/school only), `consumers` (personal only), or a specific tenant ID.
171
+
172
+ ## Tool Reference
173
+
174
+ All 181 tools listed below. Tools marked *(Graph API)* require `USE_GRAPH_API=1`. Tools marked *(AppleScript only)* are not available with Graph API.
175
+
176
+ <details>
177
+ <summary><strong>Accounts (1)</strong></summary>
178
+
179
+ | Tool | Description |
180
+ |------|-------------|
181
+ | `list_accounts` | List all Exchange accounts configured in Outlook |
182
+
183
+ </details>
184
+
185
+ <details>
186
+ <summary><strong>Mail -- Reading (9)</strong></summary>
187
+
188
+ | Tool | Description |
189
+ |------|-------------|
190
+ | `list_folders` | List all mail folders with message and unread counts |
191
+ | `list_emails` | List emails in a folder with pagination |
192
+ | `search_emails` | Search emails by subject, sender, or content |
193
+ | `search_emails_advanced` | Advanced email search using KQL (Keyword Query Language) *(Graph API)* |
194
+ | `check_new_emails` | Check for new/changed emails since last check via delta sync *(Graph API)* |
195
+ | `get_email` | Get full email details including body |
196
+ | `get_emails` | Get multiple emails by ID in a single call (max 25) |
197
+ | `list_conversation` | List all messages in an email conversation/thread *(Graph API)* |
198
+ | `get_unread_count` | Get unread email count |
199
+
200
+ </details>
201
+
202
+ <details>
203
+ <summary><strong>Mail -- Sending & Drafts (16)</strong></summary>
204
+
205
+ | Tool | Description |
206
+ |------|-------------|
207
+ | `send_email` | Send an email with optional CC, BCC, attachments, and HTML |
208
+ | `create_draft` | Create a draft email for later editing and sending |
209
+ | `update_draft` | Update an existing draft email |
210
+ | `add_draft_attachment` | Add a file attachment to a draft *(Graph API)* |
211
+ | `add_draft_inline_image` | Add an inline image to a draft for HTML body *(Graph API)* |
212
+ | `list_drafts` | List all draft emails |
213
+ | `prepare_send_draft` | Prepare to send a draft (two-phase approval) |
214
+ | `confirm_send_draft` | Confirm and send a draft |
215
+ | `prepare_send_email` | Prepare to send an email immediately (two-phase) |
216
+ | `confirm_send_email` | Confirm and send the email |
217
+ | `prepare_reply_email` | Prepare to reply to an email (two-phase) |
218
+ | `confirm_reply_email` | Confirm and send the reply |
219
+ | `prepare_forward_email` | Prepare to forward an email (two-phase) |
220
+ | `confirm_forward_email` | Confirm and forward the email |
221
+ | `reply_as_draft` | Create a reply (or reply-all) as an editable draft |
222
+ | `forward_as_draft` | Create a forward as an editable draft |
223
+
224
+ </details>
225
+
226
+ <details>
227
+ <summary><strong>Mail -- Organization (24)</strong></summary>
228
+
229
+ | Tool | Description |
230
+ |------|-------------|
231
+ | `mark_email_read` | Mark an email as read |
232
+ | `mark_email_unread` | Mark an email as unread |
233
+ | `set_email_flag` | Set a follow-up flag on an email |
234
+ | `clear_email_flag` | Clear the follow-up flag from an email |
235
+ | `set_email_categories` | Set categories on an email |
236
+ | `set_email_importance` | Set email importance level (low, normal, high) *(Graph API)* |
237
+ | `create_folder` | Create a new mail folder |
238
+ | `rename_folder` | Rename a mail folder |
239
+ | `move_folder` | Move a mail folder under a different parent |
240
+ | `prepare_delete_email` | Prepare to delete an email (two-phase) |
241
+ | `confirm_delete_email` | Confirm email deletion |
242
+ | `prepare_move_email` | Prepare to move an email to another folder (two-phase) |
243
+ | `confirm_move_email` | Confirm email move |
244
+ | `prepare_archive_email` | Prepare to archive an email (two-phase) |
245
+ | `confirm_archive_email` | Confirm email archive |
246
+ | `prepare_junk_email` | Prepare to mark an email as junk (two-phase) |
247
+ | `confirm_junk_email` | Confirm marking as junk |
248
+ | `prepare_delete_folder` | Prepare to delete a mail folder (two-phase) |
249
+ | `confirm_delete_folder` | Confirm folder deletion |
250
+ | `prepare_empty_folder` | Prepare to empty a folder (two-phase) |
251
+ | `confirm_empty_folder` | Confirm emptying folder |
252
+ | `prepare_batch_delete_emails` | Prepare to batch delete multiple emails (two-phase) |
253
+ | `prepare_batch_move_emails` | Prepare to batch move multiple emails (two-phase) |
254
+ | `confirm_batch_operation` | Confirm a batch delete or move operation |
255
+
256
+ </details>
257
+
258
+ <details>
259
+ <summary><strong>Mail -- Rules (4)</strong> <em>(Graph API)</em></summary>
260
+
261
+ | Tool | Description |
262
+ |------|-------------|
263
+ | `list_mail_rules` | List all inbox mail rules |
264
+ | `create_mail_rule` | Create an inbox rule with conditions and actions |
265
+ | `prepare_delete_mail_rule` | Prepare to delete a mail rule (two-phase) |
266
+ | `confirm_delete_mail_rule` | Confirm mail rule deletion |
267
+
268
+ </details>
269
+
270
+ <details>
271
+ <summary><strong>Mail -- Categories (4)</strong> <em>(Graph API)</em></summary>
272
+
273
+ | Tool | Description |
274
+ |------|-------------|
275
+ | `list_categories` | List all master categories |
276
+ | `create_category` | Create a new master category with a color preset |
277
+ | `prepare_delete_category` | Prepare to delete a master category (two-phase) |
278
+ | `confirm_delete_category` | Confirm category deletion |
279
+
280
+ </details>
281
+
282
+ <details>
283
+ <summary><strong>Mail -- Focused Inbox (4)</strong> <em>(Graph API)</em></summary>
284
+
285
+ | Tool | Description |
286
+ |------|-------------|
287
+ | `list_focused_overrides` | List all focused inbox overrides |
288
+ | `create_focused_override` | Create a focused inbox override for a sender |
289
+ | `prepare_delete_focused_override` | Prepare to delete a focused inbox override (two-phase) |
290
+ | `confirm_delete_focused_override` | Confirm focused inbox override deletion |
291
+
292
+ </details>
293
+
294
+ <details>
295
+ <summary><strong>Mail -- Settings & Auto-Replies (4)</strong> <em>(Graph API)</em></summary>
296
+
297
+ | Tool | Description |
298
+ |------|-------------|
299
+ | `get_automatic_replies` | Get automatic replies (out-of-office) settings |
300
+ | `set_automatic_replies` | Set automatic replies (out-of-office) settings |
301
+ | `get_mailbox_settings` | Get mailbox settings (language, time zone, formats, working hours) |
302
+ | `update_mailbox_settings` | Update mailbox settings (language, time zone, formats) |
303
+
304
+ </details>
305
+
306
+ <details>
307
+ <summary><strong>Mail -- Tips & Headers (3)</strong> <em>(Graph API)</em></summary>
308
+
309
+ | Tool | Description |
310
+ |------|-------------|
311
+ | `get_mail_tips` | Get mail tips (auto-replies, mailbox full, restrictions) for addresses |
312
+ | `get_message_headers` | Get internet message headers (SPF, DKIM, routing) |
313
+ | `get_message_mime` | Download the full MIME content (.eml) of an email |
314
+
315
+ </details>
316
+
317
+ <details>
318
+ <summary><strong>Attachments (2)</strong></summary>
319
+
320
+ | Tool | Description |
321
+ |------|-------------|
322
+ | `list_attachments` | List attachment metadata (name, size, type) for an email |
323
+ | `download_attachment` | Download an email attachment to disk |
324
+
325
+ </details>
326
+
327
+ <details>
328
+ <summary><strong>Calendar -- Events (11)</strong></summary>
329
+
330
+ | Tool | Description |
331
+ |------|-------------|
332
+ | `list_calendars` | List all calendar folders |
333
+ | `list_events` | List calendar events with date range filtering |
334
+ | `get_event` | Get event details |
335
+ | `search_events` | Search events by title and/or date range |
336
+ | `create_event` | Create a calendar event (supports Teams online meetings) |
337
+ | `update_event` | Update event details (single instance or series) |
338
+ | `respond_to_event` | Accept, decline, or tentatively accept an invitation |
339
+ | `delete_event` | Delete a calendar event or recurring series |
340
+ | `prepare_delete_event` | Prepare to delete a calendar event (two-phase) *(Graph API)* |
341
+ | `confirm_delete_event` | Confirm calendar event deletion |
342
+ | `list_event_instances` | List instances of a recurring event in a date range *(Graph API)* |
343
+
344
+ </details>
345
+
346
+ <details>
347
+ <summary><strong>Calendar -- Groups (2)</strong> <em>(Graph API)</em></summary>
348
+
349
+ | Tool | Description |
350
+ |------|-------------|
351
+ | `list_calendar_groups` | List all calendar groups |
352
+ | `create_calendar_group` | Create a new calendar group |
353
+
354
+ </details>
355
+
356
+ <details>
357
+ <summary><strong>Calendar -- Permissions (4)</strong> <em>(Graph API)</em></summary>
358
+
359
+ | Tool | Description |
360
+ |------|-------------|
361
+ | `list_calendar_permissions` | List sharing permissions for a calendar |
362
+ | `create_calendar_permission` | Share a calendar by creating a permission |
363
+ | `prepare_delete_calendar_permission` | Prepare to delete a calendar permission (two-phase) |
364
+ | `confirm_delete_calendar_permission` | Confirm calendar permission deletion |
365
+
366
+ </details>
367
+
368
+ <details>
369
+ <summary><strong>Calendar -- Rooms (2)</strong> <em>(Graph API)</em></summary>
370
+
371
+ | Tool | Description |
372
+ |------|-------------|
373
+ | `list_room_lists` | List all room lists (building/floor groupings) |
374
+ | `list_rooms` | List meeting rooms, optionally filtered by room list |
375
+
376
+ </details>
377
+
378
+ <details>
379
+ <summary><strong>Contacts & Folders (13)</strong></summary>
380
+
381
+ | Tool | Description |
382
+ |------|-------------|
383
+ | `list_contacts` | List contacts with pagination |
384
+ | `search_contacts` | Search contacts by name |
385
+ | `get_contact` | Get contact details |
386
+ | `create_contact` | Create a new contact *(Graph API)* |
387
+ | `update_contact` | Update contact details *(Graph API)* |
388
+ | `prepare_delete_contact` | Prepare to delete a contact (two-phase) *(Graph API)* |
389
+ | `confirm_delete_contact` | Confirm contact deletion |
390
+ | `get_contact_photo` | Download a contact's photo *(Graph API)* |
391
+ | `set_contact_photo` | Set or update a contact's photo *(Graph API)* |
392
+ | `list_contact_folders` | List all contact folders *(Graph API)* |
393
+ | `create_contact_folder` | Create a contact folder *(Graph API)* |
394
+ | `prepare_delete_contact_folder` | Prepare to delete a contact folder (two-phase) *(Graph API)* |
395
+ | `confirm_delete_contact_folder` | Confirm contact folder deletion |
396
+
397
+ </details>
398
+
399
+ <details>
400
+ <summary><strong>Tasks & Task Lists (13)</strong></summary>
401
+
402
+ | Tool | Description |
403
+ |------|-------------|
404
+ | `list_task_lists` | List all task lists (Microsoft To Do) *(Graph API)* |
405
+ | `list_tasks` | List tasks with pagination and filtering |
406
+ | `search_tasks` | Search tasks by name |
407
+ | `get_task` | Get task details |
408
+ | `create_task` | Create a task with optional recurrence *(Graph API)* |
409
+ | `update_task` | Update task details with optional recurrence *(Graph API)* |
410
+ | `complete_task` | Mark a task as completed *(Graph API)* |
411
+ | `create_task_list` | Create a new task list *(Graph API)* |
412
+ | `rename_task_list` | Rename a task list *(Graph API)* |
413
+ | `prepare_delete_task` | Prepare to delete a task (two-phase) *(Graph API)* |
414
+ | `confirm_delete_task` | Confirm task deletion |
415
+ | `prepare_delete_task_list` | Prepare to delete a task list (two-phase) *(Graph API)* |
416
+ | `confirm_delete_task_list` | Confirm task list deletion |
417
+
418
+ </details>
419
+
420
+ <details>
421
+ <summary><strong>Checklist Items (5)</strong> <em>(Graph API)</em></summary>
422
+
423
+ | Tool | Description |
424
+ |------|-------------|
425
+ | `list_checklist_items` | List checklist items (subtasks) on a To Do task |
426
+ | `create_checklist_item` | Create a checklist item on a To Do task |
427
+ | `update_checklist_item` | Update a checklist item (toggle check, rename) |
428
+ | `prepare_delete_checklist_item` | Prepare to delete a checklist item (two-phase) |
429
+ | `confirm_delete_checklist_item` | Confirm checklist item deletion |
430
+
431
+ </details>
432
+
433
+ <details>
434
+ <summary><strong>Linked Resources (4)</strong> <em>(Graph API)</em></summary>
435
+
436
+ | Tool | Description |
437
+ |------|-------------|
438
+ | `list_linked_resources` | List linked resources on a To Do task |
439
+ | `create_linked_resource` | Create a linked resource on a To Do task |
440
+ | `prepare_delete_linked_resource` | Prepare to delete a linked resource (two-phase) |
441
+ | `confirm_delete_linked_resource` | Confirm linked resource deletion |
442
+
443
+ </details>
444
+
445
+ <details>
446
+ <summary><strong>Task Attachments (4)</strong> <em>(Graph API)</em></summary>
447
+
448
+ | Tool | Description |
449
+ |------|-------------|
450
+ | `list_task_attachments` | List attachments on a To Do task |
451
+ | `create_task_attachment` | Attach a file to a To Do task (base64 encoded) |
452
+ | `prepare_delete_task_attachment` | Prepare to delete a task attachment (two-phase) |
453
+ | `confirm_delete_task_attachment` | Confirm task attachment deletion |
454
+
455
+ </details>
456
+
457
+ <details>
458
+ <summary><strong>Notes (3)</strong> <em>(AppleScript only)</em></summary>
459
+
460
+ | Tool | Description |
461
+ |------|-------------|
462
+ | `list_notes` | List notes with pagination |
463
+ | `get_note` | Get note details |
464
+ | `search_notes` | Search notes by content |
465
+
466
+ > Notes are only available with the AppleScript backend. Microsoft Graph API does not provide access to Outlook Notes.
467
+
468
+ </details>
469
+
470
+ <details>
471
+ <summary><strong>Scheduling (2)</strong> <em>(Graph API)</em></summary>
472
+
473
+ | Tool | Description |
474
+ |------|-------------|
475
+ | `check_availability` | Check free/busy availability for people in a time window |
476
+ | `find_meeting_times` | Find available meeting time slots for a group of attendees |
477
+
478
+ </details>
479
+
480
+ <details>
481
+ <summary><strong>Mail -- Signatures (2)</strong> <em>(Graph API)</em></summary>
482
+
483
+ | Tool | Description |
484
+ |------|-------------|
485
+ | `set_signature` | Save an email signature auto-appended to outgoing emails |
486
+ | `get_signature` | Get the currently stored email signature |
487
+
488
+ </details>
489
+
490
+ <details>
491
+ <summary><strong>Teams -- Channels (8)</strong> <em>(Graph API)</em></summary>
492
+
493
+ | Tool | Description |
494
+ |------|-------------|
495
+ | `list_teams` | List all Microsoft Teams the user has joined |
496
+ | `list_channels` | List all channels in a team |
497
+ | `get_channel` | Get details for a specific channel |
498
+ | `create_channel` | Create a new channel in a team |
499
+ | `update_channel` | Update a channel name or description |
500
+ | `prepare_delete_channel` | Prepare to delete a channel (two-phase) |
501
+ | `confirm_delete_channel` | Confirm channel deletion |
502
+ | `list_team_members` | List all members of a team |
503
+
504
+ </details>
505
+
506
+ <details>
507
+ <summary><strong>Teams -- Channel Messages (6)</strong> <em>(Graph API)</em></summary>
508
+
509
+ | Tool | Description |
510
+ |------|-------------|
511
+ | `list_channel_messages` | List recent messages in a channel |
512
+ | `get_channel_message` | Get a specific channel message with its replies |
513
+ | `prepare_send_channel_message` | Prepare to send a message to a channel (two-phase) |
514
+ | `confirm_send_channel_message` | Confirm sending a channel message |
515
+ | `prepare_reply_channel_message` | Prepare to reply to a channel message (two-phase) |
516
+ | `confirm_reply_channel_message` | Confirm replying to a channel message |
517
+
518
+ </details>
519
+
520
+ <details>
521
+ <summary><strong>Teams -- Chats (6)</strong> <em>(Graph API)</em></summary>
522
+
523
+ | Tool | Description |
524
+ |------|-------------|
525
+ | `list_chats` | List recent 1:1 and group chats |
526
+ | `get_chat` | Get details of a specific chat |
527
+ | `list_chat_messages` | List recent messages in a chat |
528
+ | `prepare_send_chat_message` | Prepare to send a message in a chat (two-phase) |
529
+ | `confirm_send_chat_message` | Confirm sending a chat message |
530
+ | `list_chat_members` | List members of a chat |
531
+
532
+ </details>
533
+
534
+ <details>
535
+ <summary><strong>People & Presence (8)</strong> <em>(Graph API)</em></summary>
536
+
537
+ | Tool | Description |
538
+ |------|-------------|
539
+ | `list_relevant_people` | List AI-ranked relevant people for the current user |
540
+ | `search_people` | Search people by name or email |
541
+ | `get_manager` | Get the current user's manager |
542
+ | `get_direct_reports` | Get the current user's direct reports |
543
+ | `get_user_profile` | Get a user's profile information |
544
+ | `get_user_photo` | Get a user's profile photo |
545
+ | `get_user_presence` | Get a user's presence/availability status |
546
+ | `get_users_presence` | Batch get presence status for multiple users |
547
+
548
+ </details>
549
+
550
+ <details>
551
+ <summary><strong>Planner (17)</strong> <em>(Graph API)</em></summary>
552
+
553
+ | Tool | Description |
554
+ |------|-------------|
555
+ | `list_plans` | List all Planner plans the user has access to |
556
+ | `get_plan` | Get details for a specific Planner plan |
557
+ | `create_plan` | Create a new Planner plan in a Microsoft 365 group |
558
+ | `update_plan` | Update a Planner plan title |
559
+ | `list_buckets` | List all buckets in a Planner plan |
560
+ | `create_bucket` | Create a new bucket in a Planner plan |
561
+ | `update_bucket` | Update a Planner bucket name |
562
+ | `prepare_delete_bucket` | Prepare to delete a Planner bucket (two-phase) |
563
+ | `confirm_delete_bucket` | Confirm Planner bucket deletion |
564
+ | `list_planner_tasks` | List all tasks in a Planner plan |
565
+ | `get_planner_task` | Get details for a specific Planner task |
566
+ | `create_planner_task` | Create a new task in a Planner plan |
567
+ | `update_planner_task` | Update a Planner task |
568
+ | `prepare_delete_planner_task` | Prepare to delete a Planner task (two-phase) |
569
+ | `confirm_delete_planner_task` | Confirm Planner task deletion |
570
+ | `get_planner_task_details` | Get task details (description, checklist, references) |
571
+ | `update_planner_task_details` | Update task details (requires ETag from get_planner_task_details) |
572
+
573
+ </details>
574
+
575
+ ## Architecture
576
+
577
+ ### Dual Backend
578
+
579
+ The server supports two backends:
580
+
581
+ - **Microsoft Graph API (default)** -- connects to Microsoft 365 cloud services. Full read/write across all 181 tools. No Outlook installation required. Works on macOS, Windows, and Linux.
582
+ - **AppleScript** (`USE_APPLESCRIPT=1`) -- communicates with classic Outlook for Mac via `osascript`. Works offline, no Microsoft account needed. Limited to reading mail, calendar, contacts, tasks, and notes, plus calendar write operations and email sending.
583
+
584
+ ### Two-Phase Approval
585
+
586
+ Destructive operations (delete, send, move, forward, etc.) use a prepare/confirm pattern. The `prepare_*` call returns a preview and a short-lived approval token. The `confirm_*` call executes the action only with a valid token. This prevents accidental data loss.
587
+
588
+ ### ID Caching
589
+
590
+ The server maintains an internal ID mapping layer. AppleScript and Graph API use different ID formats; the caching layer assigns stable numeric IDs so tool callers do not need to track backend-specific identifiers.
591
+
592
+ ### ETag Caching
593
+
594
+ Planner resources use ETag-based concurrency control. The server caches ETags from read operations and automatically includes them in update/delete requests to prevent conflicts.
595
+
596
+ ### Source Layout
597
+
598
+ ```
599
+ src/
600
+ applescript/ AppleScript integration (legacy backend)
601
+ graph/ Microsoft Graph API integration (default)
602
+ auth/ MSAL authentication, device code flow, token cache
603
+ client/ Graph client wrapper with response caching
604
+ mappers/ Graph-to-internal type mappers
605
+ tools/ MCP tool implementations (mail-send, mailbox-organization, etc.)
606
+ types/ TypeScript type definitions
607
+ utils/ Date parsing, error handling, utilities
608
+ ```
609
+
610
+ ## Required Graph API Permissions
611
+
612
+ These delegated permissions are requested when using the Graph API backend:
613
+
614
+ | Permission | Purpose |
615
+ |------------|---------|
616
+ | `Mail.ReadWrite` | Read, send, and manage mail |
617
+ | `Calendars.ReadWrite` | Read and manage calendar events |
618
+ | `Contacts.ReadWrite` | Read and manage contacts |
619
+ | `Tasks.ReadWrite` | Read and manage To Do tasks |
620
+ | `User.Read` | Read user profile |
621
+ | `offline_access` | Token refresh (maintain access) |
622
+ | `ChannelMessage.Read.All` | Read Teams channel messages |
623
+ | `ChannelMessage.Send` | Send Teams channel messages |
624
+ | `Channel.ReadBasic.All` | Read Teams channel metadata |
625
+ | `Team.ReadBasic.All` | Read Teams metadata |
626
+ | `Chat.ReadWrite` | Read and send Teams chat messages |
627
+ | `ChatMessage.Send` | Send Teams chat messages |
628
+ | `People.Read` | Read relevant people |
629
+ | `User.ReadBasic.All` | Read basic user profiles and photos |
630
+ | `Presence.Read.All` | Read user presence/availability |
631
+ | `Group.Read.All` | Read Microsoft 365 groups (for Planner) |
632
+
633
+ ## Environment Variables
634
+
635
+ | Variable | Description | Default |
636
+ |----------|-------------|---------|
637
+ | `USE_APPLESCRIPT` | Set to `1` or `true` for legacy AppleScript backend | (unset -- uses Graph API) |
638
+ | `OUTLOOK_MCP_CLIENT_ID` | Override the embedded Azure AD client ID | (embedded) |
639
+ | `OUTLOOK_MCP_TENANT_ID` | Azure AD tenant ID | `common` |
640
+
641
+ ## Known Limitations
642
+
643
+ **AppleScript backend:**
644
+ - Google accounts in Outlook are not accessible (macOS/Outlook limitation). Use IMAP configuration or the Graph API backend instead.
645
+ - Write operations limited to calendar events and email sending. All other writes require Graph API.
646
+
647
+ **Graph API backend:**
648
+ - Outlook Notes are not available (Graph API does not expose them). Use AppleScript backend for notes.
649
+
650
+ ## Contributing
651
+
652
+ We welcome contributions. Please see our [Contributing Guide](CONTRIBUTING.md) for details.
653
+
654
+ **Support policy:** This is a part-time, hobby project. Response times are best-effort (typically 1-2 weeks for bug reports). See [SUPPORT.md](SUPPORT.md) for details.
655
+
656
+ This project adheres to our [Code of Conduct](CODE_OF_CONDUCT.md).
657
+
658
+ ## Support This Project
659
+
660
+ - Star this repository
661
+ - [GitHub Sponsors](https://github.com/sponsors/jbctechsolutions)
662
+ - [Buy Me a Coffee](https://buymeacoffee.com/jbctechsolutions)
663
+ - [PayPal](https://paypal.me/jbctechsolutions)
664
+
665
+ ## License
666
+
667
+ MIT License -- Copyright (c) 2026 JBC Tech Solutions, LLC. See [LICENSE](LICENSE) for details.