mcp-teams 0.2.16 → 0.3.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.
package/README.md CHANGED
@@ -100,13 +100,16 @@ Every AI session starts its own mcp-teams server, and they share the one extensi
100
100
  |---|---|---|
101
101
  | `token` | — | random, generated once; the server, its peers and the extension prove to each other that they know it |
102
102
  | `port` | `TEAMS_MCP_PORT` | `47393` (also set it in the extension popup) |
103
+ | `autoSendTo` | — | `[]`: every send shows the confirmation window |
104
+
105
+ `autoSendTo` is a list of your own email addresses (or UPNs), compared without regard to case or surrounding spaces, e.g. `"autoSendTo": ["you@example.com"]`. With it, `send_message` posts without the confirmation window when the message goes to you alone: your notes-to-self chat, a chat whose only member is you, or `to` with just your own address. The extension decides this itself after resolving the target: it looks up your profile and posts without asking only if one of your own addresses is on the list. Anything else (other people, group chats you are in, meetings, channels, a chat or profile it can't look up) shows the window as usual. The result then says `autoSent: true`. A value that isn't a list of email addresses stops the server with an error. Restart the AI session after changing it.
103
106
 
104
107
  ## Security notes
105
108
 
106
109
  - The bridge listens only on `127.0.0.1`. Web pages can't connect to it, because only extension origins are accepted.
107
110
  - The server and the extension prove to each other that they know the pairing token in `~/.mcp-teams/config.json`, without sending it. Setup copies it into the installed extension folder as `pairing.json`; both files can be read only by your user. So a program that takes the port while no AI app runs gets nothing from the extension, and a program posing as the extension gets no calls.
108
111
  - Teams' tokens are only ever sent to the service they were captured from.
109
- - Messages can contain prompt injection. The send-confirmation window is the safeguard, so read it before clicking Send.
112
+ - Messages can contain prompt injection. The send-confirmation window is the safeguard, so read it before clicking Send. With `autoSendTo` set, messages to yourself alone skip it (see Configuration).
110
113
  - The extension may observe requests to Microsoft hosts (`*.microsoft.com`, `*.office.com`, `*.sharepoint.com` and similar), but it only records requests made by the Teams tab, and only names, for `api_traffic`. It runs requests only in Teams tabs, and in SharePoint tabs to read transcripts.
111
114
  - If you also give an AI direct control of your browser or desktop, it could click the confirmation button itself. Don't combine the two if you rely on the confirmation step.
112
115
 
@@ -127,6 +130,6 @@ npm test # builds, then runs unit, integration and system test
127
130
  npm run probe -- status # calls one extension method through the bridge (see scripts/probe.mjs)
128
131
  ```
129
132
 
130
- Versions are bumped automatically. On every push to `main` (except Markdown-only changes), the **Version bump** GitHub Action runs the tests, then bumps `package.json`, `package-lock.json` and `extension/manifest.json`, commits `chore(release): vX.Y.Z` and tags it. `feat:` commits bump the minor version, anything else the patch. Stay on 0.x: don't use `type!:` or a `BREAKING CHANGE:` footer.
133
+ Versions are bumped automatically. On every push to `main` (except Markdown-only changes), the **Version bump** GitHub Action runs the tests, then bumps `package.json`, `package-lock.json` and `extension/manifest.json`, commits `chore(release): vX.Y.Z` and tags it. While the version is below 1.0.0, a breaking change (`type!:` or a `BREAKING CHANGE:` footer) bumps the minor version and anything else, `feat:` included, the patch. From 1.0.0 on it's standard semver: breaking → major, `feat:` → minor, anything else → patch.
131
134
 
132
135
  Every pull request and every push to `main` is also scanned for committed secrets by the **Secret scan** GitHub Action (gitleaks). Known false positives go in `.gitleaksignore`.
package/dist/config.js CHANGED
@@ -8,6 +8,28 @@ const pkg = require("../package.json");
8
8
  export const SERVER_VERSION = pkg.version;
9
9
  export const CONFIG_DIR = process.env.TEAMS_MCP_HOME ?? join(homedir(), ".mcp-teams");
10
10
  const CONFIG_FILE = join(CONFIG_DIR, "config.json");
11
+ const EMAIL = /^[^\s@]+@[^\s@]+$/;
12
+ /**
13
+ * `autoSendTo` from config.json: a list of email addresses, trimmed, lowercased and without
14
+ * duplicates. Missing (or null) is an empty list. Anything else that isn't a list of addresses
15
+ * is an error, so a mistyped allowlist is noticed rather than quietly ignored.
16
+ */
17
+ export function parseAutoSendTo(value) {
18
+ if (value == null)
19
+ return [];
20
+ const list = typeof value === "string" ? [value] : value;
21
+ if (!Array.isArray(list))
22
+ throw new Error(`autoSendTo in ${CONFIG_FILE} must be a list of email addresses.`);
23
+ const out = [];
24
+ for (const v of list) {
25
+ const address = typeof v === "string" ? v.trim().toLowerCase() : "";
26
+ if (!EMAIL.test(address))
27
+ throw new Error(`autoSendTo in ${CONFIG_FILE}: ${JSON.stringify(v)} is not an email address.`);
28
+ if (!out.includes(address))
29
+ out.push(address);
30
+ }
31
+ return out;
32
+ }
11
33
  /** Loads ~/.mcp-teams/config.json, creating it (with a fresh pairing token) on first run. */
12
34
  export function loadConfig() {
13
35
  let stored = {};
@@ -22,6 +44,7 @@ export function loadConfig() {
22
44
  return {
23
45
  port: Number(process.env.TEAMS_MCP_PORT ?? stored.port ?? 47393),
24
46
  token: stored.token,
47
+ autoSendTo: parseAutoSendTo(stored.autoSendTo),
25
48
  };
26
49
  }
27
50
  export const CONFIG_PATH = CONFIG_FILE;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,CAAC,MAAM,cAAc,GAAW,GAAG,CAAC,OAAO,CAAC;AAOlD,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACtF,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,6FAA6F;AAC7F,MAAM,UAAU,UAAU;IACxB,IAAI,MAAM,GAAoB,EAAE,CAAC;IACjC,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrD,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC;QAChE,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/tools.js CHANGED
@@ -49,6 +49,7 @@ function capText(messages, maxLength) {
49
49
  return messages.map(cut);
50
50
  }
51
51
  export function registerTools(server, bridge, config) {
52
+ const autoSendTo = config.autoSendTo ?? [];
52
53
  server.registerTool("get_version", {
53
54
  title: "Version and connection status",
54
55
  description: "Shows the mcp-teams server version, the browser extension version, and whether Teams is reachable (which of its services have a session).",
@@ -191,7 +192,11 @@ export function registerTools(server, bridge, config) {
191
192
  }, safe(async (args, extra) => text(await bridge.call("findPeople", args, READ_TIMEOUT_MS, extra.signal))));
192
193
  server.registerTool("send_message", {
193
194
  title: "Send a message (needs your click)",
194
- description: "Asks to post a message in an existing chat or channel (conversation), to reply to a channel post, or to start a chat with people (to): one person for a 1:1 chat, several for a group chat. If a chat with exactly those people already exists, the message goes there. The extension shows a confirmation window with the message, where it goes and who is in a new chat; nothing is posted, and no chat is created, unless the user clicks Send there. Returns whether it was sent. Plain text; line breaks are kept and links become clickable.",
195
+ description: "Asks to post a message in an existing chat or channel (conversation), to reply to a channel post, or to start a chat with people (to): one person for a 1:1 chat, several for a group chat. If a chat with exactly those people already exists, the message goes there. The extension shows a confirmation window with the message, where it goes and who is in a new chat; nothing is posted, and no chat is created, unless the user clicks Send there. Returns whether it was sent. Plain text; line breaks are kept and links become clickable." +
196
+ // Only with autoSendTo set, so the default description (and the tool contract) stays as it is.
197
+ (autoSendTo.length
198
+ ? " Exception set in the user's config (autoSendTo): a message to the user alone (their notes-to-self chat, or to: their own address) is posted without the window; the result then says autoSent."
199
+ : ""),
195
200
  inputSchema: {
196
201
  conversation: conversation.optional(),
197
202
  to: z
@@ -211,7 +216,12 @@ export function registerTools(server, bridge, config) {
211
216
  if (!conversation === !to)
212
217
  throw new Error("Give either conversation (an existing chat or channel) or to (people to start a chat with).");
213
218
  try {
214
- return text(await bridge.call("requestSend", { conversation, to, title, text: message, threadId: reply_to, subject }, SEND_TIMEOUT_MS, extra.signal));
219
+ // The allowlist travels with each request rather than in the connection's hello: a peer's
220
+ // call is relayed through the hub, so only the request carries the config of the server
221
+ // that made it. It is only a permission: the extension posts without the window only
222
+ // after resolving the target itself to the signed-in user alone, with an allowed address.
223
+ const params = { conversation, to, title, text: message, threadId: reply_to, subject, ...(autoSendTo.length ? { autoSendTo } : {}) };
224
+ return text(await bridge.call("requestSend", params, SEND_TIMEOUT_MS, extra.signal));
215
225
  }
216
226
  catch (err) {
217
227
  const message = err.message;
@@ -219,7 +229,8 @@ export function registerTools(server, bridge, config) {
219
229
  // the user may have clicked Send just before, so retrying blindly could post twice.
220
230
  if (!isLostCall(message))
221
231
  throw err;
222
- throw new Error(`${message} The message may have been posted if the user had just clicked Send: check with read_messages before sending again.`);
232
+ const self = autoSendTo.length ? " (or, to the user alone, without asking: autoSendTo)" : "";
233
+ throw new Error(`${message} The message may have been posted if the user had just clicked Send${self}: check with read_messages before sending again.`);
223
234
  }
224
235
  }));
225
236
  }
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
@@ -935,17 +935,24 @@ export const handlers = {
935
935
  */
936
936
  async reload() {
937
937
  if (pendingSends.size) throw new Error("A message is waiting for your decision in the confirmation window; reload after that.");
938
+ if (autoSending) throw new Error("A message is being posted; reload after that.");
938
939
  setTimeout(() => chrome.runtime.reload(), 250); // after this response is sent
939
940
  return { reloading: true, version: VERSION };
940
941
  },
941
942
 
942
- async requestSend({ conversation, to, title, text, threadId, subject }, ctx) {
943
+ async requestSend({ conversation, to, title, text, threadId, subject, autoSendTo }, ctx) {
943
944
  if (!String(text ?? "").trim()) throw new Error("The message is empty.");
945
+ // The server's allowlist (config autoSendTo) only permits; whether this send goes without the
946
+ // window is decided below from the target as resolved here (see sendsToMeAlone, isMeAlone).
947
+ const allow = teams.normalizeAddresses(autoSendTo);
944
948
  if (to?.length) {
945
949
  if (conversation) throw new Error("Give either a conversation or people (to), not both.");
946
950
  if (threadId || subject) throw new Error("reply_to and subject are for channels; a new chat takes people and an optional title.");
947
951
  const me = await myMri();
948
952
  if (!me) throw new Error("Teams hasn't shown who is signed in yet. Reload the Teams tab and try again.");
953
+ if (allow.length && !title && (await sendsToMeAlone(to, me, allow, ctx))) {
954
+ return sendWithoutConfirming({ conversation: NOTES_TO_SELF, text: String(text) }, ctx);
955
+ }
949
956
  const people = await resolvePeople(to, me, ctx);
950
957
  if (title && people.length < 2) throw new Error("A title is only for group chats (two or more people besides you).");
951
958
  const existing = teams.findExistingChat((await teamsAndChats(true, ctx)).chats, people.map((p) => p.mri), me, title);
@@ -963,6 +970,7 @@ export const handlers = {
963
970
  replyingTo = root ? teams.parseMessage(root) : { id: threadId };
964
971
  }
965
972
  const request = { conversation: conv, text: String(text), threadId: threadId ?? null, subject: subject ?? null, replyingTo };
973
+ if (allow.length && !threadId && !subject && (await isMeAlone(conv, allow, ctx))) return sendWithoutConfirming(request, ctx);
966
974
  return askUserToConfirm(request, ctx);
967
975
  },
968
976
  };
@@ -1027,6 +1035,85 @@ async function sendMessage({ conversation, newChat, people, text, threadId, subj
1027
1035
  return { sent: true, conversation: conversation.title ?? conversation.id, time: r?.OriginalArrivalTime ? new Date(r.OriginalArrivalTime).toISOString() : null };
1028
1036
  }
1029
1037
 
1038
+ // ------------------------------------------------------------ auto-send to self (autoSendTo)
1039
+
1040
+ /**
1041
+ * With autoSendTo in the server's config, a message to the signed-in user alone is posted
1042
+ * without the confirmation window. The server only passes the allowlist; the decision is made
1043
+ * here, from the target as resolved here: Teams' notes-to-self chat (48:notes), a chat whose
1044
+ * only member is me, or `to` naming just me. And one of my own addresses (email or UPN, from
1045
+ * my profile) must be on the list. Anything else (a group, meeting or channel, other people, a
1046
+ * chat whose members aren't known, a failed lookup) gets the window as usual.
1047
+ */
1048
+ const NOTES_TO_SELF = { id: "48:notes", kind: "self", title: "Notes to self" };
1049
+ const AUTO_SENT_NOTE = "Sent without confirmation (auto-send to self): it went only to you, and your address is in autoSendTo in the mcp-teams config.";
1050
+ let myAddressCache = null; // { me, addresses }
1051
+ let autoSending = 0; // auto-sends being posted (reload waits for them as for a window)
1052
+
1053
+ /** The signed-in user's own addresses (email, UPN), from their mt short profile. */
1054
+ async function myAddresses(me, ctx) {
1055
+ if (myAddressCache?.me === me) return myAddressCache.addresses;
1056
+ const json = await api("mt", "/beta/users/fetchShortProfile?isMailAddress=false&enableGuest=true&includeIBBarredUsers=true&skypeTeamsInfo=true", {
1057
+ method: "POST",
1058
+ body: [me],
1059
+ ctx,
1060
+ repeatable: true,
1061
+ });
1062
+ const addresses = teams.profileAddresses(json, me);
1063
+ if (addresses.length) myAddressCache = { me, addresses };
1064
+ return addresses;
1065
+ }
1066
+
1067
+ /** myAddresses, or none when they can't be looked up (then the window shows). */
1068
+ async function myAddressesOrNone(me, ctx) {
1069
+ return myAddresses(me, ctx).catch(() => {
1070
+ ctx?.check(); // a withdrawn request ends here
1071
+ return [];
1072
+ });
1073
+ }
1074
+
1075
+ /** `to` is just me (my MRI, or one of my own addresses), and one of my addresses is allowed. */
1076
+ async function sendsToMeAlone(to, me, allow, ctx) {
1077
+ if (to.length !== 1) return false;
1078
+ const q = String(to[0]).trim().toLowerCase();
1079
+ const isMyMri = q === me.toLowerCase();
1080
+ if (!isMyMri && !q.includes("@")) return false; // a name is never auto-sent
1081
+ const mine = await myAddressesOrNone(me, ctx);
1082
+ if (!isMyMri && !mine.includes(q)) return false;
1083
+ return mine.some((a) => allow.includes(a));
1084
+ }
1085
+
1086
+ /** The resolved conversation reaches me alone, and one of my addresses is allowed. */
1087
+ async function isMeAlone(conv, allow, ctx) {
1088
+ const me = await myMri();
1089
+ if (!me) return false;
1090
+ let alone = conv.id === NOTES_TO_SELF.id;
1091
+ if (!alone && conv.kind !== "channel" && conv.kind !== "meeting") {
1092
+ // Members from a fresh list: a chat that has anyone else in it is never auto-sent.
1093
+ const data = await teamsAndChats(true, ctx).catch(() => {
1094
+ ctx?.check();
1095
+ return null;
1096
+ });
1097
+ const chat = data?.chats.find((c) => c.id === conv.id);
1098
+ const members = [...new Set(chat?.members ?? [])];
1099
+ alone = !!chat && chat.kind !== "meeting" && chat.kind !== "channel" && members.length === 1 && members[0] === me;
1100
+ }
1101
+ return alone && (await myAddressesOrNone(me, ctx)).some((a) => allow.includes(a));
1102
+ }
1103
+
1104
+ /** Posts without the window (see above). Once started, the post runs to the end, as after a click. */
1105
+ async function sendWithoutConfirming(request, ctx) {
1106
+ if (ctx?.cancelled) return WITHDRAWN;
1107
+ autoSending++;
1108
+ try {
1109
+ return { ...(await sendMessage(request)), autoSent: true, note: AUTO_SENT_NOTE };
1110
+ } catch (err) {
1111
+ return { sent: false, autoSent: true, reason: sendFailure(err) };
1112
+ } finally {
1113
+ autoSending--;
1114
+ }
1115
+ }
1116
+
1030
1117
  // ------------------------------------------------------------ send confirmation
1031
1118
 
1032
1119
  /**
@@ -1082,6 +1169,17 @@ async function askUserToConfirm(request, ctx) {
1082
1169
  });
1083
1170
  }
1084
1171
 
1172
+ /** Why a post failed, as told to the AI. */
1173
+ function sendFailure(err) {
1174
+ // Without an answer the post may have gone through: saying it failed would invite a second one.
1175
+ const cause = /[.!?]$/.test(err.message) ? err.message : `${err.message}.`;
1176
+ return err.chatMayExist
1177
+ ? `Creating the chat did not finish: ${cause} The chat may have been created, without the message: check with list_chats before trying again.`
1178
+ : err.outcomeUnknown
1179
+ ? `Sending did not finish: ${cause} The message may have been posted: check with read_messages before sending again.`
1180
+ : `Sending failed: ${err.message}`;
1181
+ }
1182
+
1085
1183
  function onWindowRemoved(windowId) {
1086
1184
  for (const p of pendingSends.values()) {
1087
1185
  if (p.windowId === windowId) p.finish({ sent: false, reason: "The user closed the confirmation window; nothing was sent." });
@@ -1108,14 +1206,7 @@ function onConfirmMessage(msg, sender, sendResponse) {
1108
1206
  p.finish(await sendMessage(p.request), true);
1109
1207
  sendResponse({ ok: true });
1110
1208
  } catch (err) {
1111
- // Without an answer the post may have gone through: saying it failed would invite a second one.
1112
- const cause = /[.!?]$/.test(err.message) ? err.message : `${err.message}.`;
1113
- const reason = err.chatMayExist
1114
- ? `Creating the chat did not finish: ${cause} The chat may have been created, without the message: check with list_chats before trying again.`
1115
- : err.outcomeUnknown
1116
- ? `Sending did not finish: ${cause} The message may have been posted: check with read_messages before sending again.`
1117
- : `Sending failed: ${err.message}`;
1118
- p.finish({ sent: false, reason }, true);
1209
+ p.finish({ sent: false, reason: sendFailure(err) }, true);
1119
1210
  sendResponse({ ok: false, error: err.message });
1120
1211
  }
1121
1212
  })();
@@ -2,7 +2,7 @@
2
2
  "manifest_version": 3,
3
3
  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvoz9Wexl4ZqY9YtEyBZsu/Qi5Ft5EjNUNB8b30wgt3AR8TjXI5UumcPQFBIm7ZfvBsjgrh6tBJlygsgFbZ5cB1EiI+WSz/2Wcqwz4eowKMXXPvGuDGrO+2O2zbSpTG19/MwTljI+g0TLfn8Vkoqd8z9MskKk+vCZjjV0Jk8QjVEdHypgM7H8zTuUM06SO12IIZMdeE3IURzf35zbjlfPPkJiDWoo3wB9nxAvLd57xrQhPUB/lGtCJk9mS3SY+/VwOlG5kJ9WS/RCHXcs5Qs7huIlKIatmFz7YiducvTR3DKBbjqbMTyqHzXkmkUmJRqzsYtgtKcz0C0cjFOt6uNdhwIDAQAB",
4
4
  "name": "mcp-teams bridge",
5
- "version": "0.2.16",
5
+ "version": "0.3.1",
6
6
  "description": "Lets AI assistants (via the mcp-teams MCP server) read and search Microsoft Teams chats, channels and meeting transcripts and, with your explicit confirmation, post messages.",
7
7
  "minimum_chrome_version": "116",
8
8
  "icons": {
@@ -217,6 +217,21 @@ export function parseProfiles(json) {
217
217
  }));
218
218
  }
219
219
 
220
+ /** Email addresses as compared for autoSendTo: trimmed, lowercased; anything else left out. */
221
+ export function normalizeAddresses(list) {
222
+ if (!Array.isArray(list)) return [];
223
+ const out = list.map((a) => (typeof a === "string" ? a.trim().toLowerCase() : "")).filter((a) => /^[^\s@]+@[^\s@]+$/.test(a));
224
+ return [...new Set(out)];
225
+ }
226
+
227
+ /** Every address (email and UPN) short profiles (mt fetchShortProfile) give for this MRI, normalized. */
228
+ export function profileAddresses(json, mri) {
229
+ const list = Array.isArray(json) ? json : (json?.value ?? []);
230
+ const oid = oidOf(mri);
231
+ const mine = list.filter((p) => p && (p.mri === mri || (oid && String(p.objectId ?? "").toLowerCase() === oid)));
232
+ return normalizeAddresses(mine.flatMap((p) => [p.email, p.userPrincipalName]));
233
+ }
234
+
220
235
  /** People from substrate's suggestions API. */
221
236
  export function parseSuggestions(json) {
222
237
  const groups = json?.Groups ?? json?.groups ?? [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-teams",
3
- "version": "0.2.16",
3
+ "version": "0.3.1",
4
4
  "description": "MCP server that lets AI assistants work with Microsoft Teams (web) through a Chrome/Edge extension bridge",
5
5
  "keywords": ["mcp", "model-context-protocol", "teams", "microsoft-teams", "microsoft-365", "chat", "claude", "chrome-extension"],
6
6
  "repository": {