@sam2kb/m365-mcp 1.0.4 → 1.0.6

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.
@@ -1,169 +1,328 @@
1
1
  /**
2
- * Contacts tools — list, search, read, create, update, delete
2
+ * Contacts tools — rich contact CRUD, categories, and contact folders.
3
3
  */
4
+ const CONTACT_STRING_FIELDS = [
5
+ "givenName", "middleName", "surname", "title", "generation", "displayName",
6
+ "nickName", "mobilePhone", "jobTitle", "department", "officeLocation",
7
+ "profession", "businessHomePage", "birthday", "spouseName", "assistantName",
8
+ "manager", "fileAs",
9
+ ];
10
+ const CONTACT_ARRAY_FIELDS = [
11
+ "homePhones", "children", "categories", "imAddresses",
12
+ ];
13
+ function encodeId(id) {
14
+ return encodeURIComponent(id);
15
+ }
16
+ function normalizeTop(value, fallback) {
17
+ if (value === undefined)
18
+ return fallback;
19
+ if (!Number.isInteger(value) || value < 1 || value > 500) {
20
+ throw new Error("top must be an integer between 1 and 500");
21
+ }
22
+ return value;
23
+ }
24
+ function contactCollectionPath(location) {
25
+ if (location.parentFolderId && !location.folderId) {
26
+ throw new Error("folderId is required when parentFolderId is provided");
27
+ }
28
+ if (location.parentFolderId && location.folderId) {
29
+ return `/me/contactFolders/${encodeId(location.parentFolderId)}/childFolders/${encodeId(location.folderId)}/contacts`;
30
+ }
31
+ if (location.folderId) {
32
+ return `/me/contactFolders/${encodeId(location.folderId)}/contacts`;
33
+ }
34
+ return "/me/contacts";
35
+ }
36
+ function contactResourcePath(location, contactId) {
37
+ return `${contactCollectionPath(location)}/${encodeId(contactId)}`;
38
+ }
39
+ function folderResourcePath(folderId, parentFolderId) {
40
+ if (parentFolderId) {
41
+ return `/me/contactFolders/${encodeId(parentFolderId)}/childFolders/${encodeId(folderId)}`;
42
+ }
43
+ return `/me/contactFolders/${encodeId(folderId)}`;
44
+ }
45
+ function buildContactPayload(args) {
46
+ const payload = {};
47
+ for (const field of CONTACT_STRING_FIELDS) {
48
+ if (args[field] !== undefined)
49
+ payload[field] = args[field];
50
+ }
51
+ for (const field of CONTACT_ARRAY_FIELDS) {
52
+ if (args[field] !== undefined)
53
+ payload[field] = args[field];
54
+ }
55
+ if (args.emailAddresses !== undefined) {
56
+ payload.emailAddresses = args.emailAddresses;
57
+ }
58
+ else if (args.email !== undefined) {
59
+ const name = [args.givenName, args.surname].filter(Boolean).join(" ");
60
+ payload.emailAddresses = [{ address: args.email, ...(name ? { name } : {}) }];
61
+ }
62
+ if (args.businessPhones !== undefined) {
63
+ payload.businessPhones = args.businessPhones;
64
+ }
65
+ else if (args.businessPhone !== undefined) {
66
+ payload.businessPhones = args.businessPhone ? [args.businessPhone] : [];
67
+ }
68
+ if (args.companyName !== undefined) {
69
+ payload.companyName = args.companyName;
70
+ }
71
+ else if (args.company !== undefined) {
72
+ payload.companyName = args.company;
73
+ }
74
+ if (args.personalNotes !== undefined) {
75
+ payload.personalNotes = args.personalNotes;
76
+ }
77
+ else if (args.notes !== undefined) {
78
+ payload.personalNotes = args.notes;
79
+ }
80
+ for (const field of ["homeAddress", "businessAddress", "otherAddress"]) {
81
+ if (args[field] !== undefined)
82
+ payload[field] = args[field];
83
+ }
84
+ return payload;
85
+ }
86
+ function summarizeContact(contact) {
87
+ return {
88
+ id: contact.id,
89
+ name: contact.displayName,
90
+ emails: contact.emailAddresses ?? [],
91
+ company: contact.companyName,
92
+ jobTitle: contact.jobTitle,
93
+ businessPhones: contact.businessPhones ?? [],
94
+ mobilePhone: contact.mobilePhone,
95
+ categories: contact.categories ?? [],
96
+ parentFolderId: contact.parentFolderId,
97
+ };
98
+ }
99
+ function normalizeCategoryFilter(filter) {
100
+ if (filter.category !== undefined && filter.categories !== undefined) {
101
+ throw new Error("Use category or categories, not both");
102
+ }
103
+ const categories = filter.categories ?? (filter.category !== undefined ? [filter.category] : []);
104
+ if (categories.some((category) => category.length === 0)) {
105
+ throw new Error("Category names cannot be empty");
106
+ }
107
+ const match = filter.categoryMatch ?? "any";
108
+ if (match !== "any" && match !== "all") {
109
+ throw new Error('categoryMatch must be "any" or "all"');
110
+ }
111
+ return {
112
+ categories: [...new Set(categories.map((category) => category.toLocaleLowerCase()))],
113
+ match,
114
+ };
115
+ }
116
+ async function getContacts(client, path, top, filter) {
117
+ const { categories, match } = normalizeCategoryFilter(filter);
118
+ if (categories.length === 0)
119
+ return client.getAll(path, 10, top);
120
+ const matches = [];
121
+ for await (const page of client.paginate(path, 10)) {
122
+ for (const contact of page) {
123
+ const assigned = new Set((contact.categories ?? []).map((category) => category.toLocaleLowerCase()));
124
+ const matched = match === "all"
125
+ ? categories.every((category) => assigned.has(category))
126
+ : categories.some((category) => assigned.has(category));
127
+ if (matched) {
128
+ matches.push(contact);
129
+ if (matches.length === top)
130
+ return matches;
131
+ }
132
+ }
133
+ }
134
+ return matches;
135
+ }
4
136
  export function registerContactsTools(client) {
5
- const user = "/me";
6
137
  return {
7
138
  async contacts_list(args) {
8
- const top = args.top || 50;
9
- const folderPath = args.folderId
10
- ? `/contactFolders/${encodeURIComponent(args.folderId)}`
11
- : "";
12
- const path = `${user}${folderPath}/contacts?$top=${top}&$orderby=displayName`;
13
- const contacts = await client.getAll(path, 10, top);
14
- return JSON.stringify(contacts.map((c) => ({
15
- id: c.id,
16
- name: c.displayName,
17
- email: c.emailAddresses?.[0]?.address,
18
- company: c.companyName,
19
- jobTitle: c.jobTitle,
20
- phones: c.businessPhones,
21
- mobile: c.mobilePhone,
22
- })), null, 2);
139
+ const top = normalizeTop(args.top, 50);
140
+ const path = `${contactCollectionPath(args)}?$top=${Math.min(top, 100)}&$orderby=displayName`;
141
+ const contacts = await getContacts(client, path, top, args);
142
+ return JSON.stringify(contacts.map(summarizeContact), null, 2);
23
143
  },
24
144
  async contacts_search(args) {
25
- const top = args.top || 20;
26
- const path = `${user}/contacts?$search="${encodeURIComponent(args.query)}"&$top=${top}`;
27
- const contacts = await client.getAll(path, 10, top);
28
- return JSON.stringify(contacts.map((c) => ({
29
- id: c.id,
30
- name: c.displayName,
31
- email: c.emailAddresses?.map((e) => e.address).join(", "),
32
- company: c.companyName,
33
- jobTitle: c.jobTitle,
34
- })), null, 2);
145
+ const top = normalizeTop(args.top, 20);
146
+ const path = `${contactCollectionPath(args)}?$search=%22${encodeURIComponent(args.query)}%22&$top=${Math.min(top, 100)}`;
147
+ const contacts = await getContacts(client, path, top, args);
148
+ return JSON.stringify(contacts.map(summarizeContact), null, 2);
35
149
  },
36
150
  async contacts_read(args) {
37
- const contactId = encodeURIComponent(args.contactId);
38
- const c = await client.get(`${user}/contacts/${contactId}`);
39
- return JSON.stringify(c, null, 2);
151
+ const contact = await client.get(contactResourcePath(args, args.contactId));
152
+ return JSON.stringify(contact, null, 2);
40
153
  },
41
154
  async contacts_create(args) {
42
- const contact = {};
43
- if (args.givenName)
44
- contact.givenName = args.givenName;
45
- if (args.surname)
46
- contact.surname = args.surname;
47
- if (args.email) {
48
- contact.emailAddresses = [{ address: args.email, name: `${args.givenName || ""} ${args.surname || ""}`.trim() }];
49
- }
50
- if (args.company)
51
- contact.companyName = args.company;
52
- if (args.jobTitle)
53
- contact.jobTitle = args.jobTitle;
54
- if (args.mobilePhone)
55
- contact.mobilePhone = args.mobilePhone;
56
- if (args.businessPhone)
57
- contact.businessPhones = [args.businessPhone];
58
- if (args.notes)
59
- contact.personalNotes = args.notes;
60
- const data = await client.post(`${user}/contacts`, contact);
61
- return JSON.stringify({ id: data.id, displayName: data.displayName, success: true }, null, 2);
155
+ const contact = buildContactPayload(args);
156
+ if (Object.keys(contact).length === 0)
157
+ throw new Error("Provide at least one contact field");
158
+ const data = await client.post(contactCollectionPath(args), contact);
159
+ return JSON.stringify({ id: data.id, displayName: data.displayName, categories: data.categories ?? [], success: true }, null, 2);
62
160
  },
63
161
  async contacts_update(args) {
64
- const patch = {};
65
- if (args.givenName)
66
- patch.givenName = args.givenName;
67
- if (args.surname)
68
- patch.surname = args.surname;
69
- if (args.email)
70
- patch.emailAddresses = [{ address: args.email }];
71
- if (args.company)
72
- patch.companyName = args.company;
73
- if (args.jobTitle)
74
- patch.jobTitle = args.jobTitle;
75
- if (args.mobilePhone)
76
- patch.mobilePhone = args.mobilePhone;
77
- const contactId = encodeURIComponent(args.contactId);
78
- await client.patch(`${user}/contacts/${contactId}`, patch);
162
+ const patch = buildContactPayload(args);
163
+ if (Object.keys(patch).length === 0)
164
+ throw new Error("Provide at least one contact field to update");
165
+ await client.patch(contactResourcePath(args, args.contactId), patch);
79
166
  return JSON.stringify({ success: true, contactId: args.contactId });
80
167
  },
81
168
  async contacts_delete(args) {
82
- const contactId = encodeURIComponent(args.contactId);
83
- await client.delete(`${user}/contacts/${contactId}`);
84
- return JSON.stringify({ success: true });
169
+ await client.delete(contactResourcePath(args, args.contactId));
170
+ return JSON.stringify({ success: true, contactId: args.contactId });
171
+ },
172
+ async contacts_categories_list(args = {}) {
173
+ const path = `${contactCollectionPath(args)}?$top=100&$select=id,categories`;
174
+ const contacts = await client.getAll(path, 100, 10_000);
175
+ const categories = new Map();
176
+ for (const contact of contacts) {
177
+ const seen = new Set();
178
+ for (const name of contact.categories ?? []) {
179
+ const key = name.toLocaleLowerCase();
180
+ if (seen.has(key))
181
+ continue;
182
+ seen.add(key);
183
+ const existing = categories.get(key);
184
+ if (existing)
185
+ existing.count++;
186
+ else
187
+ categories.set(key, { name, count: 1 });
188
+ }
189
+ }
190
+ return JSON.stringify([...categories.values()].sort((a, b) => a.name.localeCompare(b.name)), null, 2);
191
+ },
192
+ async contacts_folders_list(args = {}) {
193
+ const top = normalizeTop(args.top, 100);
194
+ const base = args.parentFolderId
195
+ ? `/me/contactFolders/${encodeId(args.parentFolderId)}/childFolders`
196
+ : "/me/contactFolders";
197
+ const folders = await client.getAll(`${base}?$top=${Math.min(top, 100)}&$orderby=displayName`, 10, top);
198
+ return JSON.stringify(folders, null, 2);
199
+ },
200
+ async contacts_folder_create(args) {
201
+ const path = `/me/contactFolders/${encodeId(args.parentFolderId)}/childFolders`;
202
+ const folder = await client.post(path, { displayName: args.displayName });
203
+ return JSON.stringify({ ...folder, success: true }, null, 2);
204
+ },
205
+ async contacts_folder_update(args) {
206
+ const patch = {};
207
+ if (args.displayName !== undefined)
208
+ patch.displayName = args.displayName;
209
+ if (args.moveToParentFolderId !== undefined)
210
+ patch.parentFolderId = args.moveToParentFolderId;
211
+ if (Object.keys(patch).length === 0)
212
+ throw new Error("Provide displayName or moveToParentFolderId");
213
+ const folder = await client.patch(folderResourcePath(args.folderId, args.parentFolderId), patch);
214
+ return JSON.stringify({ ...folder, success: true }, null, 2);
215
+ },
216
+ async contacts_folder_delete(args) {
217
+ await client.delete(folderResourcePath(args.folderId, args.parentFolderId));
218
+ return JSON.stringify({ success: true, folderId: args.folderId });
85
219
  },
86
220
  };
87
221
  }
222
+ const locationProperties = {
223
+ folderId: { type: "string", description: "Optional contact folder ID; omit for the default Contacts folder" },
224
+ parentFolderId: { type: "string", description: "Parent folder ID when folderId identifies a direct child folder" },
225
+ };
226
+ const categoryFilterProperties = {
227
+ category: { type: "string", minLength: 1, description: "One exact category name (case-insensitive)" },
228
+ categories: {
229
+ type: "array",
230
+ minItems: 1,
231
+ uniqueItems: true,
232
+ description: "Exact category names (case-insensitive); use categoryMatch for any/all behavior",
233
+ items: { type: "string", minLength: 1 },
234
+ },
235
+ categoryMatch: {
236
+ type: "string",
237
+ enum: ["any", "all"],
238
+ default: "any",
239
+ description: "Match any supplied category or require all supplied categories",
240
+ },
241
+ };
242
+ const addressSchema = {
243
+ type: "object",
244
+ additionalProperties: false,
245
+ properties: {
246
+ street: { type: "string" }, city: { type: "string" }, state: { type: "string" },
247
+ countryOrRegion: { type: "string" }, postalCode: { type: "string" }, postOfficeBox: { type: "string" },
248
+ },
249
+ };
250
+ const stringArraySchema = (description) => ({ type: "array", description, items: { type: "string" } });
251
+ const contactFieldProperties = {
252
+ givenName: { type: "string", description: "First name" },
253
+ middleName: { type: "string" }, surname: { type: "string", description: "Last name" },
254
+ title: { type: "string", description: "Courtesy title, such as Dr. or Ms." },
255
+ generation: { type: "string", description: "Name suffix, such as Jr." },
256
+ displayName: { type: "string" }, nickName: { type: "string" },
257
+ email: { type: "string", description: "Single-email convenience field" },
258
+ emailAddresses: {
259
+ type: "array", description: "Complete email list; an empty array clears all email addresses",
260
+ items: { type: "object", additionalProperties: false, properties: { name: { type: "string" }, address: { type: "string" } }, required: ["address"] },
261
+ },
262
+ mobilePhone: { type: "string" },
263
+ businessPhone: { type: "string", description: "Single-business-phone convenience field" },
264
+ businessPhones: stringArraySchema("Complete business phone list; empty clears it"),
265
+ homePhones: stringArraySchema("Complete home phone list; empty clears it"),
266
+ company: { type: "string", description: "Company-name convenience field" },
267
+ companyName: { type: "string" }, jobTitle: { type: "string" }, department: { type: "string" },
268
+ officeLocation: { type: "string" }, profession: { type: "string" }, businessHomePage: { type: "string" },
269
+ notes: { type: "string", description: "Personal-notes convenience field" }, personalNotes: { type: "string" },
270
+ birthday: { type: "string", description: "ISO 8601 date-time in UTC" }, spouseName: { type: "string" },
271
+ assistantName: { type: "string" }, manager: { type: "string" },
272
+ children: stringArraySchema("Children names; empty clears the list"),
273
+ categories: stringArraySchema("Outlook category names; empty removes all categories"),
274
+ imAddresses: stringArraySchema("Instant-messaging addresses; empty clears the list"),
275
+ fileAs: { type: "string" }, homeAddress: addressSchema, businessAddress: addressSchema, otherAddress: addressSchema,
276
+ };
88
277
  export const contactsToolSchemas = [
89
278
  {
90
279
  name: "m365_contacts_list",
91
- description: "List your contacts",
92
- inputSchema: {
93
- type: "object",
94
- properties: {
95
- top: { type: "number", description: "Max results", default: 50 },
96
- folderId: { type: "string", description: "Contact folder ID (optional)" },
97
- },
98
- },
280
+ description: "List contacts, optionally within a folder and filtered by one or more exact category names",
281
+ inputSchema: { type: "object", properties: { top: { type: "number", minimum: 1, maximum: 500, default: 50 }, ...categoryFilterProperties, ...locationProperties } },
99
282
  },
100
283
  {
101
284
  name: "m365_contacts_search",
102
- description: "Search your contacts by name, email, or company",
103
- inputSchema: {
104
- type: "object",
105
- properties: {
106
- query: { type: "string", description: "Search query" },
107
- top: { type: "number", description: "Max results", default: 20 },
108
- },
109
- required: ["query"],
110
- },
285
+ description: "Search contacts by name, email, or company, optionally within a folder and filtered by exact categories",
286
+ inputSchema: { type: "object", properties: { query: { type: "string" }, top: { type: "number", minimum: 1, maximum: 500, default: 20 }, ...categoryFilterProperties, ...locationProperties }, required: ["query"] },
111
287
  },
112
288
  {
113
- name: "m365_contacts_read",
114
- description: "Read a contact's full details",
115
- inputSchema: {
116
- type: "object",
117
- properties: {
118
- contactId: { type: "string", description: "Contact ID" },
119
- },
120
- required: ["contactId"],
121
- },
289
+ name: "m365_contacts_read", description: "Read a contact's full details",
290
+ inputSchema: { type: "object", properties: { contactId: { type: "string" }, ...locationProperties }, required: ["contactId"] },
122
291
  },
123
292
  {
124
293
  name: "m365_contacts_create",
125
- description: "Create a new contact",
126
- inputSchema: {
127
- type: "object",
128
- properties: {
129
- givenName: { type: "string", description: "First name" },
130
- surname: { type: "string", description: "Last name" },
131
- email: { type: "string", description: "Email address" },
132
- company: { type: "string", description: "Company name" },
133
- jobTitle: { type: "string", description: "Job title" },
134
- mobilePhone: { type: "string", description: "Mobile phone" },
135
- businessPhone: { type: "string", description: "Business phone" },
136
- notes: { type: "string", description: "Personal notes" },
137
- },
138
- },
294
+ description: "Create a contact with names, multiple emails and phones, categories, addresses, and work or personal details",
295
+ inputSchema: { type: "object", properties: { ...contactFieldProperties, ...locationProperties } },
139
296
  },
140
297
  {
141
298
  name: "m365_contacts_update",
142
- description: "Update an existing contact",
143
- inputSchema: {
144
- type: "object",
145
- properties: {
146
- contactId: { type: "string", description: "Contact ID" },
147
- givenName: { type: "string" },
148
- surname: { type: "string" },
149
- email: { type: "string" },
150
- company: { type: "string" },
151
- jobTitle: { type: "string" },
152
- mobilePhone: { type: "string" },
153
- },
154
- required: ["contactId"],
155
- },
299
+ description: "Update or clear contact fields; use empty strings or arrays to clear supported values",
300
+ inputSchema: { type: "object", properties: { contactId: { type: "string" }, ...contactFieldProperties, ...locationProperties }, required: ["contactId"] },
156
301
  },
157
302
  {
158
- name: "m365_contacts_delete",
159
- description: "Delete a contact",
160
- inputSchema: {
161
- type: "object",
162
- properties: {
163
- contactId: { type: "string", description: "Contact ID" },
164
- },
165
- required: ["contactId"],
166
- },
303
+ name: "m365_contacts_delete", description: "Move a contact to Deleted Items",
304
+ inputSchema: { type: "object", properties: { contactId: { type: "string" }, ...locationProperties }, required: ["contactId"] },
305
+ },
306
+ {
307
+ name: "m365_contacts_categories_list",
308
+ description: "List unique category names assigned to contacts in the default or selected folder, with usage counts",
309
+ inputSchema: { type: "object", properties: { ...locationProperties } },
310
+ },
311
+ {
312
+ name: "m365_contacts_folders_list", description: "List top-level contact folders or the direct children of one folder",
313
+ inputSchema: { type: "object", properties: { parentFolderId: { type: "string" }, top: { type: "number", minimum: 1, maximum: 500, default: 100 } } },
314
+ },
315
+ {
316
+ name: "m365_contacts_folder_create", description: "Create a child contact folder under an existing contact folder",
317
+ inputSchema: { type: "object", properties: { parentFolderId: { type: "string" }, displayName: { type: "string" } }, required: ["parentFolderId", "displayName"] },
318
+ },
319
+ {
320
+ name: "m365_contacts_folder_update", description: "Rename or move a top-level or direct-child contact folder",
321
+ inputSchema: { type: "object", properties: { folderId: { type: "string" }, parentFolderId: { type: "string", description: "Current parent when this is a child folder" }, displayName: { type: "string" }, moveToParentFolderId: { type: "string", description: "New parent folder ID" } }, required: ["folderId"] },
322
+ },
323
+ {
324
+ name: "m365_contacts_folder_delete", description: "Delete a non-default top-level or direct-child contact folder",
325
+ inputSchema: { type: "object", properties: { folderId: { type: "string" }, parentFolderId: { type: "string", description: "Current parent when this is a child folder" } }, required: ["folderId"] },
167
326
  },
168
327
  ];
169
328
  //# sourceMappingURL=contacts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/tools/contacts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/tools/contacts.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -120,6 +120,8 @@ export interface Contact {
120
120
  homeAddress?: any;
121
121
  businessAddress?: any;
122
122
  personalNotes?: string;
123
+ categories?: string[];
124
+ parentFolderId?: string;
123
125
  }
124
126
  export interface DriveItem {
125
127
  id: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sam2kb/m365-mcp",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "Production-grade Microsoft 365 MCP server — email, calendar, contacts, OneDrive, Teams, tasks, and users via delegated OAuth",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",