teams-api-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +406 -0
- package/SKILL.md +130 -0
- package/dist/actions.d.ts +49 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +842 -0
- package/dist/actions.js.map +1 -0
- package/dist/api.d.ts +111 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +630 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.d.ts +53 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +479 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +178 -0
- package/dist/cli.js.map +1 -0
- package/dist/mcp-server.d.ts +35 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +144 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/teams-client.d.ts +197 -0
- package/dist/teams-client.d.ts.map +1 -0
- package/dist/teams-client.js +545 -0
- package/dist/teams-client.js.map +1 -0
- package/dist/token-store.d.ts +14 -0
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +79 -0
- package/dist/token-store.js.map +1 -0
- package/dist/types.d.ts +245 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -0
- package/package.json +69 -0
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication module for Teams API.
|
|
3
|
+
*
|
|
4
|
+
* Three strategies:
|
|
5
|
+
* 1. Interactive login: Open a visible browser, let the user log in manually,
|
|
6
|
+
* capture skype token via CDP Fetch interception. Works on all platforms.
|
|
7
|
+
* 2. Auto-login: Launch system Chrome, complete FIDO2/passkey via platform authenticator,
|
|
8
|
+
* capture skype token from CDP Fetch interception. macOS only.
|
|
9
|
+
* 3. Debug session: Connect to a running Chrome debug session with Teams open,
|
|
10
|
+
* intercept the token during a page reload.
|
|
11
|
+
*
|
|
12
|
+
* All strategies return a TeamsToken that can be used with the API layer.
|
|
13
|
+
*/
|
|
14
|
+
import type { TeamsToken, AutoLoginOptions, InteractiveLoginOptions, ManualTokenOptions } from "./types.js";
|
|
15
|
+
/**
|
|
16
|
+
* Acquire a Teams skype token with zero user interaction.
|
|
17
|
+
*
|
|
18
|
+
* Launches system Chrome with a fresh profile, navigates to Teams,
|
|
19
|
+
* enters the corporate email, lets the platform authenticator complete
|
|
20
|
+
* the FIDO2 passkey challenge, then intercepts the skype token from
|
|
21
|
+
* the authenticated network requests.
|
|
22
|
+
*
|
|
23
|
+
* Requirements:
|
|
24
|
+
* - macOS with a FIDO2 platform authenticator (e.g. Intune/Company Portal)
|
|
25
|
+
* - System Chrome installed (or custom chromePath)
|
|
26
|
+
* - playwright package
|
|
27
|
+
*/
|
|
28
|
+
export declare function acquireTokenViaAutoLogin(options: AutoLoginOptions): Promise<TeamsToken>;
|
|
29
|
+
/**
|
|
30
|
+
* Acquire a Teams skype token via interactive browser login.
|
|
31
|
+
*
|
|
32
|
+
* Opens a visible Chromium window (Playwright's bundled browser),
|
|
33
|
+
* navigates to Teams, and waits for the user to complete login
|
|
34
|
+
* manually. Once Teams loads, the skype token is captured via
|
|
35
|
+
* CDP Fetch interception.
|
|
36
|
+
*
|
|
37
|
+
* Works on all platforms (macOS, Windows, Linux). No FIDO2 passkey
|
|
38
|
+
* or system Chrome required.
|
|
39
|
+
*/
|
|
40
|
+
export declare function acquireTokenViaInteractiveLogin(options?: InteractiveLoginOptions): Promise<TeamsToken>;
|
|
41
|
+
/**
|
|
42
|
+
* Capture a Teams skype token from an existing Chrome debug session.
|
|
43
|
+
*
|
|
44
|
+
* Connects via puppeteer-core to a running Chrome instance with Teams open,
|
|
45
|
+
* intercepts network headers during a page reload, and extracts the token.
|
|
46
|
+
*
|
|
47
|
+
* Usage:
|
|
48
|
+
* 1. Start Chrome with --remote-debugging-port=9222
|
|
49
|
+
* 2. Navigate to Teams and log in
|
|
50
|
+
* 3. Call this function
|
|
51
|
+
*/
|
|
52
|
+
export declare function acquireTokenViaDebugSession(options?: ManualTokenOptions): Promise<TeamsToken>;
|
|
53
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAsPpB;;;;;;;;;;;;GAYG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CA4IrB;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,+BAA+B,CACnD,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,UAAU,CAAC,CAoFrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAwHrB"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Authentication module for Teams API.
|
|
4
|
+
*
|
|
5
|
+
* Three strategies:
|
|
6
|
+
* 1. Interactive login: Open a visible browser, let the user log in manually,
|
|
7
|
+
* capture skype token via CDP Fetch interception. Works on all platforms.
|
|
8
|
+
* 2. Auto-login: Launch system Chrome, complete FIDO2/passkey via platform authenticator,
|
|
9
|
+
* capture skype token from CDP Fetch interception. macOS only.
|
|
10
|
+
* 3. Debug session: Connect to a running Chrome debug session with Teams open,
|
|
11
|
+
* intercept the token during a page reload.
|
|
12
|
+
*
|
|
13
|
+
* All strategies return a TeamsToken that can be used with the API layer.
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.acquireTokenViaAutoLogin = acquireTokenViaAutoLogin;
|
|
17
|
+
exports.acquireTokenViaInteractiveLogin = acquireTokenViaInteractiveLogin;
|
|
18
|
+
exports.acquireTokenViaDebugSession = acquireTokenViaDebugSession;
|
|
19
|
+
const TEAMS_URL = "https://teams.cloud.microsoft/";
|
|
20
|
+
const DEFAULT_SYSTEM_CHROME_PATH = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome";
|
|
21
|
+
const DEFAULT_PROFILE_DIRECTORY = "/tmp/teams-api-chrome-profile";
|
|
22
|
+
const AUTO_LOGIN_TIMEOUT = 2 * 60 * 1_000;
|
|
23
|
+
const TOKEN_INTERCEPT_TIMEOUT = 60 * 1_000;
|
|
24
|
+
const FETCH_INTERCEPT_TIMEOUT = 30 * 1_000;
|
|
25
|
+
const PAGE_RELOAD_TIMEOUT = 30 * 1_000;
|
|
26
|
+
const BROWSER_LAUNCH_TIMEOUT = 30 * 1_000;
|
|
27
|
+
const PAGE_STATE_POLL_INTERVAL = 3 * 1_000;
|
|
28
|
+
/**
|
|
29
|
+
* Diagnose the current page state during authentication.
|
|
30
|
+
* Returns a structured description of where the user is in the login flow.
|
|
31
|
+
*/
|
|
32
|
+
async function diagnosePageState(page) {
|
|
33
|
+
const url = page.url();
|
|
34
|
+
if (url.includes("login.microsoftonline.com") ||
|
|
35
|
+
url.includes("login.microsoft.com")) {
|
|
36
|
+
const pageContent = (await page
|
|
37
|
+
.evaluate("document.body?.innerText?.slice(0, 500) ?? ''")
|
|
38
|
+
.catch(() => ""));
|
|
39
|
+
if (pageContent.includes("Approve sign in request") ||
|
|
40
|
+
pageContent.includes("Enter code") ||
|
|
41
|
+
pageContent.includes("Verify your identity") ||
|
|
42
|
+
pageContent.includes("approve") ||
|
|
43
|
+
url.includes("/common/SAS")) {
|
|
44
|
+
return {
|
|
45
|
+
url,
|
|
46
|
+
phase: "mfa-challenge",
|
|
47
|
+
detail: "Waiting for MFA/2FA approval",
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
url,
|
|
52
|
+
phase: "login-page",
|
|
53
|
+
detail: "On the Microsoft login page",
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (url.includes("teams.cloud.microsoft") ||
|
|
57
|
+
url.includes("teams.microsoft.com")) {
|
|
58
|
+
const isLoaded = (await page
|
|
59
|
+
.evaluate("(document.querySelector('#app') ?? document.querySelector(\"[data-tid='app-layout']\") ?? document.querySelector('main')) !== null")
|
|
60
|
+
.catch(() => false));
|
|
61
|
+
if (isLoaded) {
|
|
62
|
+
return {
|
|
63
|
+
url,
|
|
64
|
+
phase: "teams-loaded",
|
|
65
|
+
detail: "Teams application loaded",
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
url,
|
|
70
|
+
phase: "teams-loading",
|
|
71
|
+
detail: "Teams page reached, application loading",
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (url.includes("microsoftonline.com") || url.includes("microsoft.com")) {
|
|
75
|
+
return {
|
|
76
|
+
url,
|
|
77
|
+
phase: "redirect",
|
|
78
|
+
detail: "Redirecting through Microsoft authentication",
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return { url, phase: "unknown", detail: `Unexpected page: ${url}` };
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Wait for the page to reach Teams and capture authentication tokens via CDP.
|
|
85
|
+
*
|
|
86
|
+
* Polls the page state periodically to provide diagnostic feedback instead of
|
|
87
|
+
* relying solely on timeouts. Throws a descriptive error if the login flow
|
|
88
|
+
* stalls or reaches an unexpected state.
|
|
89
|
+
*/
|
|
90
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
91
|
+
async function captureTokensFromPage(page, log, interceptTimeout) {
|
|
92
|
+
const cdpSession = (await page.context().newCDPSession(page));
|
|
93
|
+
let skypeToken = null;
|
|
94
|
+
let bearerToken = null;
|
|
95
|
+
let substrateToken = null;
|
|
96
|
+
await cdpSession.send("Fetch.enable", {
|
|
97
|
+
patterns: [
|
|
98
|
+
{ urlPattern: "*teams*", requestStage: "Request" },
|
|
99
|
+
{ urlPattern: "*substrate.office.com*", requestStage: "Request" },
|
|
100
|
+
],
|
|
101
|
+
});
|
|
102
|
+
log("Listening for tokens in network requests...");
|
|
103
|
+
const tokenPromise = new Promise((resolve) => {
|
|
104
|
+
const timeout = setTimeout(() => {
|
|
105
|
+
log("Token intercept timed out");
|
|
106
|
+
resolve();
|
|
107
|
+
}, interceptTimeout);
|
|
108
|
+
cdpSession.on("Fetch.requestPaused", async (event) => {
|
|
109
|
+
const request = event.request;
|
|
110
|
+
const requestId = event.requestId;
|
|
111
|
+
const requestUrl = request.url ?? "";
|
|
112
|
+
for (const [name, value] of Object.entries(request.headers ?? {})) {
|
|
113
|
+
if (name.toLowerCase() === "x-skypetoken" && !skypeToken) {
|
|
114
|
+
skypeToken = value;
|
|
115
|
+
}
|
|
116
|
+
if (name.toLowerCase() === "authorization" &&
|
|
117
|
+
value.startsWith("Bearer ")) {
|
|
118
|
+
if (requestUrl.includes("/api/mt/") && !bearerToken) {
|
|
119
|
+
bearerToken = value.slice("Bearer ".length);
|
|
120
|
+
}
|
|
121
|
+
if (requestUrl.includes("substrate.office.com") &&
|
|
122
|
+
!substrateToken) {
|
|
123
|
+
substrateToken = value.slice("Bearer ".length);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
await cdpSession.send("Fetch.continueRequest", { requestId });
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Request may have already been handled
|
|
132
|
+
}
|
|
133
|
+
if (skypeToken) {
|
|
134
|
+
log("Skype token captured from request headers");
|
|
135
|
+
clearTimeout(timeout);
|
|
136
|
+
resolve();
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
log("Reloading page to intercept token...");
|
|
141
|
+
page
|
|
142
|
+
.reload({ waitUntil: "domcontentloaded", timeout: PAGE_RELOAD_TIMEOUT })
|
|
143
|
+
.catch(() => {
|
|
144
|
+
// Reload may time out, but token should be captured by then
|
|
145
|
+
});
|
|
146
|
+
await tokenPromise;
|
|
147
|
+
// If we have the skype token but not the substrate token yet,
|
|
148
|
+
// wait a bit longer for substrate requests to fire
|
|
149
|
+
if (skypeToken && !substrateToken) {
|
|
150
|
+
log("Waiting for substrate token...");
|
|
151
|
+
await new Promise((resolve) => {
|
|
152
|
+
const extraTimeout = setTimeout(resolve, 5_000);
|
|
153
|
+
const checkInterval = setInterval(() => {
|
|
154
|
+
if (substrateToken) {
|
|
155
|
+
clearTimeout(extraTimeout);
|
|
156
|
+
clearInterval(checkInterval);
|
|
157
|
+
resolve();
|
|
158
|
+
}
|
|
159
|
+
}, 200);
|
|
160
|
+
extraTimeout.unref?.();
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
await cdpSession.send("Fetch.disable");
|
|
164
|
+
await cdpSession.detach();
|
|
165
|
+
if (!skypeToken) {
|
|
166
|
+
const state = await diagnosePageState(page);
|
|
167
|
+
throw new Error(`Failed to capture skype token. Page state: ${state.phase} — ${state.detail} (URL: ${state.url})`);
|
|
168
|
+
}
|
|
169
|
+
const capturedSkypeToken = skypeToken;
|
|
170
|
+
log(`Token captured (${capturedSkypeToken.length} chars)`);
|
|
171
|
+
if (bearerToken) {
|
|
172
|
+
log("Bearer token also captured for profile resolution");
|
|
173
|
+
}
|
|
174
|
+
if (substrateToken) {
|
|
175
|
+
log("Substrate token also captured for people/chat search");
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
skypeToken,
|
|
179
|
+
bearerToken: bearerToken ?? undefined,
|
|
180
|
+
substrateToken: substrateToken ?? undefined,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Acquire a Teams skype token with zero user interaction.
|
|
185
|
+
*
|
|
186
|
+
* Launches system Chrome with a fresh profile, navigates to Teams,
|
|
187
|
+
* enters the corporate email, lets the platform authenticator complete
|
|
188
|
+
* the FIDO2 passkey challenge, then intercepts the skype token from
|
|
189
|
+
* the authenticated network requests.
|
|
190
|
+
*
|
|
191
|
+
* Requirements:
|
|
192
|
+
* - macOS with a FIDO2 platform authenticator (e.g. Intune/Company Portal)
|
|
193
|
+
* - System Chrome installed (or custom chromePath)
|
|
194
|
+
* - playwright package
|
|
195
|
+
*/
|
|
196
|
+
async function acquireTokenViaAutoLogin(options) {
|
|
197
|
+
const { chromium } = await import("playwright");
|
|
198
|
+
const chromePath = options.chromePath ?? DEFAULT_SYSTEM_CHROME_PATH;
|
|
199
|
+
const profileDirectory = options.profileDirectory ?? DEFAULT_PROFILE_DIRECTORY;
|
|
200
|
+
const headless = options.headless ?? true;
|
|
201
|
+
const log = options.verbose
|
|
202
|
+
? console.log.bind(console)
|
|
203
|
+
: () => { };
|
|
204
|
+
// Clean up any previous profile to ensure a fresh session
|
|
205
|
+
const { execSync } = await import("node:child_process");
|
|
206
|
+
execSync(`rm -rf "${profileDirectory}"`);
|
|
207
|
+
log("Launching Chrome with fresh profile...");
|
|
208
|
+
const launchPromise = chromium.launchPersistentContext(profileDirectory, {
|
|
209
|
+
headless,
|
|
210
|
+
executablePath: chromePath,
|
|
211
|
+
args: [
|
|
212
|
+
"--disable-blink-features=AutomationControlled",
|
|
213
|
+
"--disable-features=VirtualAuthenticators",
|
|
214
|
+
"--enable-features=WebAuthenticationMacPlatform",
|
|
215
|
+
"--no-first-run",
|
|
216
|
+
"--no-default-browser-check",
|
|
217
|
+
],
|
|
218
|
+
ignoreDefaultArgs: ["--disable-component-extensions-with-background-pages"],
|
|
219
|
+
});
|
|
220
|
+
const context = await Promise.race([
|
|
221
|
+
launchPromise,
|
|
222
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`Chrome launch timed out after ${BROWSER_LAUNCH_TIMEOUT / 1_000}s`)), BROWSER_LAUNCH_TIMEOUT)),
|
|
223
|
+
]);
|
|
224
|
+
log("Chrome launched successfully");
|
|
225
|
+
try {
|
|
226
|
+
const page = context.pages()[0] || (await context.newPage());
|
|
227
|
+
log("Navigating to Teams...");
|
|
228
|
+
await page.goto(TEAMS_URL, {
|
|
229
|
+
waitUntil: "domcontentloaded",
|
|
230
|
+
timeout: AUTO_LOGIN_TIMEOUT,
|
|
231
|
+
});
|
|
232
|
+
// Wait for Entra ID login page
|
|
233
|
+
log(`Current URL: ${page.url()}`);
|
|
234
|
+
log("Waiting for Entra ID login page...");
|
|
235
|
+
await page
|
|
236
|
+
.waitForURL(/login\.microsoftonline\.com|login\.microsoft\.com/, {
|
|
237
|
+
timeout: AUTO_LOGIN_TIMEOUT,
|
|
238
|
+
})
|
|
239
|
+
.catch(() => {
|
|
240
|
+
log("Did not reach login page (may already be at Teams)");
|
|
241
|
+
});
|
|
242
|
+
// If at the login page, enter email and submit
|
|
243
|
+
if (page.url().includes("login.microsoftonline.com") ||
|
|
244
|
+
page.url().includes("login.microsoft.com")) {
|
|
245
|
+
log("At login page, entering email...");
|
|
246
|
+
const emailInput = await page
|
|
247
|
+
.waitForSelector('#i0116, input[name="loginfmt"], input[type="email"]', { timeout: 15_000 })
|
|
248
|
+
.catch(() => null);
|
|
249
|
+
if (emailInput) {
|
|
250
|
+
await emailInput.fill(options.email);
|
|
251
|
+
const nextButton = await page
|
|
252
|
+
.waitForSelector("#idSIButton9", { timeout: 5_000 })
|
|
253
|
+
.catch(() => null);
|
|
254
|
+
if (nextButton) {
|
|
255
|
+
log("Submitting email...");
|
|
256
|
+
await nextButton.click();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// Wait for login flow to complete, polling page state for diagnostics
|
|
260
|
+
log("Waiting for authentication to complete...");
|
|
261
|
+
const loginDeadline = Date.now() + AUTO_LOGIN_TIMEOUT;
|
|
262
|
+
while (Date.now() < loginDeadline) {
|
|
263
|
+
const state = await diagnosePageState(page);
|
|
264
|
+
if (state.phase === "teams-loaded" || state.phase === "teams-loading") {
|
|
265
|
+
log(`Reached Teams: ${state.detail}`);
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
log(`Login progress: ${state.detail}`);
|
|
269
|
+
await new Promise((resolve) => setTimeout(resolve, PAGE_STATE_POLL_INTERVAL));
|
|
270
|
+
}
|
|
271
|
+
// Final check after poll loop
|
|
272
|
+
if (!page.url().includes("teams.cloud.microsoft") &&
|
|
273
|
+
!page.url().includes("teams.microsoft.com")) {
|
|
274
|
+
const state = await diagnosePageState(page);
|
|
275
|
+
throw new Error(`Login did not complete within ${AUTO_LOGIN_TIMEOUT / 1_000}s. ` +
|
|
276
|
+
`Current state: ${state.phase} — ${state.detail} (URL: ${state.url})`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
log(`Login flow finished. URL: ${page.url()}`);
|
|
280
|
+
// Capture tokens via shared helper
|
|
281
|
+
log("Capturing tokens...");
|
|
282
|
+
const { skypeToken, bearerToken, substrateToken } = await captureTokensFromPage(page, log, TOKEN_INTERCEPT_TIMEOUT);
|
|
283
|
+
return {
|
|
284
|
+
skypeToken,
|
|
285
|
+
region: "apac",
|
|
286
|
+
bearerToken,
|
|
287
|
+
substrateToken,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
finally {
|
|
291
|
+
await context.close();
|
|
292
|
+
try {
|
|
293
|
+
execSync(`rm -rf "${profileDirectory}"`);
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
// Best-effort cleanup
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
const INTERACTIVE_LOGIN_TIMEOUT = 5 * 60 * 1_000;
|
|
301
|
+
/**
|
|
302
|
+
* Acquire a Teams skype token via interactive browser login.
|
|
303
|
+
*
|
|
304
|
+
* Opens a visible Chromium window (Playwright's bundled browser),
|
|
305
|
+
* navigates to Teams, and waits for the user to complete login
|
|
306
|
+
* manually. Once Teams loads, the skype token is captured via
|
|
307
|
+
* CDP Fetch interception.
|
|
308
|
+
*
|
|
309
|
+
* Works on all platforms (macOS, Windows, Linux). No FIDO2 passkey
|
|
310
|
+
* or system Chrome required.
|
|
311
|
+
*/
|
|
312
|
+
async function acquireTokenViaInteractiveLogin(options) {
|
|
313
|
+
const { chromium } = await import("playwright");
|
|
314
|
+
const region = options?.region ?? "apac";
|
|
315
|
+
const log = options?.verbose
|
|
316
|
+
? console.log.bind(console)
|
|
317
|
+
: () => { };
|
|
318
|
+
log("Launching browser for interactive login...");
|
|
319
|
+
const browser = await chromium.launch({ headless: false });
|
|
320
|
+
const context = await browser.newContext();
|
|
321
|
+
const page = await context.newPage();
|
|
322
|
+
try {
|
|
323
|
+
log("Navigating to Teams...");
|
|
324
|
+
await page.goto(TEAMS_URL, {
|
|
325
|
+
waitUntil: "domcontentloaded",
|
|
326
|
+
timeout: INTERACTIVE_LOGIN_TIMEOUT,
|
|
327
|
+
});
|
|
328
|
+
// Pre-fill email if provided
|
|
329
|
+
if (options?.email) {
|
|
330
|
+
try {
|
|
331
|
+
await page.waitForURL(/login\.microsoftonline\.com|login\.microsoft\.com/, { timeout: 30_000 });
|
|
332
|
+
const emailInput = await page
|
|
333
|
+
.waitForSelector('#i0116, input[name="loginfmt"], input[type="email"]', { timeout: 10_000 })
|
|
334
|
+
.catch(() => null);
|
|
335
|
+
if (emailInput) {
|
|
336
|
+
await emailInput.fill(options.email);
|
|
337
|
+
log(`Pre-filled email: ${options.email}`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
log("Could not pre-fill email (login page may have changed)");
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// Wait for user to complete login, polling page state for diagnostics
|
|
345
|
+
log("Waiting for you to complete login in the browser window...");
|
|
346
|
+
const loginDeadline = Date.now() + INTERACTIVE_LOGIN_TIMEOUT;
|
|
347
|
+
while (Date.now() < loginDeadline) {
|
|
348
|
+
const state = await diagnosePageState(page);
|
|
349
|
+
if (state.phase === "teams-loaded" || state.phase === "teams-loading") {
|
|
350
|
+
log(`Reached Teams: ${state.detail}`);
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
log(`Login progress: ${state.detail}`);
|
|
354
|
+
await new Promise((resolve) => setTimeout(resolve, PAGE_STATE_POLL_INTERVAL));
|
|
355
|
+
}
|
|
356
|
+
if (!page.url().includes("teams.cloud.microsoft") &&
|
|
357
|
+
!page.url().includes("teams.microsoft.com")) {
|
|
358
|
+
const state = await diagnosePageState(page);
|
|
359
|
+
throw new Error(`Login did not complete within ${INTERACTIVE_LOGIN_TIMEOUT / 1_000}s. ` +
|
|
360
|
+
`Current state: ${state.phase} — ${state.detail} (URL: ${state.url})`);
|
|
361
|
+
}
|
|
362
|
+
log("Login detected, capturing token...");
|
|
363
|
+
const { skypeToken, bearerToken, substrateToken } = await captureTokensFromPage(page, log, TOKEN_INTERCEPT_TIMEOUT);
|
|
364
|
+
return {
|
|
365
|
+
skypeToken,
|
|
366
|
+
region,
|
|
367
|
+
bearerToken,
|
|
368
|
+
substrateToken,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
finally {
|
|
372
|
+
await context.close();
|
|
373
|
+
await browser.close();
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Capture a Teams skype token from an existing Chrome debug session.
|
|
378
|
+
*
|
|
379
|
+
* Connects via puppeteer-core to a running Chrome instance with Teams open,
|
|
380
|
+
* intercepts network headers during a page reload, and extracts the token.
|
|
381
|
+
*
|
|
382
|
+
* Usage:
|
|
383
|
+
* 1. Start Chrome with --remote-debugging-port=9222
|
|
384
|
+
* 2. Navigate to Teams and log in
|
|
385
|
+
* 3. Call this function
|
|
386
|
+
*/
|
|
387
|
+
async function acquireTokenViaDebugSession(options) {
|
|
388
|
+
const puppeteer = await import("puppeteer-core");
|
|
389
|
+
const debugPort = options?.debugPort ?? 9222;
|
|
390
|
+
const browserUrl = `http://127.0.0.1:${debugPort}`;
|
|
391
|
+
const browser = await puppeteer.default.connect({ browserURL: browserUrl });
|
|
392
|
+
try {
|
|
393
|
+
const pages = await browser.pages();
|
|
394
|
+
const teamsPage = pages.find((page) => /teams\.(microsoft|cloud\.microsoft)/i.test(page.url()));
|
|
395
|
+
if (!teamsPage) {
|
|
396
|
+
throw new Error("No Teams page found in the browser. Navigate to Teams and log in first.");
|
|
397
|
+
}
|
|
398
|
+
const cdpSession = await teamsPage.createCDPSession();
|
|
399
|
+
let skypeToken = null;
|
|
400
|
+
let bearerToken = null;
|
|
401
|
+
let substrateToken = null;
|
|
402
|
+
await cdpSession.send("Fetch.enable", {
|
|
403
|
+
patterns: [
|
|
404
|
+
{ urlPattern: "*teams*", requestStage: "Request" },
|
|
405
|
+
{ urlPattern: "*substrate.office.com*", requestStage: "Request" },
|
|
406
|
+
],
|
|
407
|
+
});
|
|
408
|
+
const tokenPromise = new Promise((resolve) => {
|
|
409
|
+
const timeout = setTimeout(resolve, FETCH_INTERCEPT_TIMEOUT);
|
|
410
|
+
cdpSession.on("Fetch.requestPaused", async (event) => {
|
|
411
|
+
const headers = event.request.headers ?? {};
|
|
412
|
+
const requestUrl = event.request.url ?? "";
|
|
413
|
+
for (const [name, value] of Object.entries(headers)) {
|
|
414
|
+
if (name.toLowerCase() === "x-skypetoken" && !skypeToken) {
|
|
415
|
+
skypeToken = value;
|
|
416
|
+
}
|
|
417
|
+
if (name.toLowerCase() === "authorization" &&
|
|
418
|
+
value.startsWith("Bearer ")) {
|
|
419
|
+
if (requestUrl.includes("/api/mt/") && !bearerToken) {
|
|
420
|
+
bearerToken = value.slice("Bearer ".length);
|
|
421
|
+
}
|
|
422
|
+
if (requestUrl.includes("substrate.office.com") &&
|
|
423
|
+
!substrateToken) {
|
|
424
|
+
substrateToken = value.slice("Bearer ".length);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
try {
|
|
429
|
+
await cdpSession.send("Fetch.continueRequest", {
|
|
430
|
+
requestId: event.requestId,
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
catch {
|
|
434
|
+
// Request may have already been handled
|
|
435
|
+
}
|
|
436
|
+
if (skypeToken) {
|
|
437
|
+
clearTimeout(timeout);
|
|
438
|
+
resolve();
|
|
439
|
+
}
|
|
440
|
+
});
|
|
441
|
+
});
|
|
442
|
+
teamsPage
|
|
443
|
+
.reload({ waitUntil: "networkidle2", timeout: PAGE_RELOAD_TIMEOUT })
|
|
444
|
+
.catch(() => {
|
|
445
|
+
// Reload may time out
|
|
446
|
+
});
|
|
447
|
+
await tokenPromise;
|
|
448
|
+
// If we have the skype token but not the substrate token yet,
|
|
449
|
+
// wait a bit longer for substrate requests to fire
|
|
450
|
+
if (skypeToken && !substrateToken) {
|
|
451
|
+
await new Promise((resolve) => {
|
|
452
|
+
const extraTimeout = setTimeout(resolve, 5_000);
|
|
453
|
+
const checkInterval = setInterval(() => {
|
|
454
|
+
if (substrateToken) {
|
|
455
|
+
clearTimeout(extraTimeout);
|
|
456
|
+
clearInterval(checkInterval);
|
|
457
|
+
resolve();
|
|
458
|
+
}
|
|
459
|
+
}, 200);
|
|
460
|
+
extraTimeout.unref?.();
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
await cdpSession.send("Fetch.disable");
|
|
464
|
+
await cdpSession.detach();
|
|
465
|
+
if (!skypeToken) {
|
|
466
|
+
throw new Error("Failed to capture skype token. Ensure Teams is loaded and authenticated.");
|
|
467
|
+
}
|
|
468
|
+
return {
|
|
469
|
+
skypeToken,
|
|
470
|
+
region: "apac",
|
|
471
|
+
bearerToken: bearerToken ?? undefined,
|
|
472
|
+
substrateToken: substrateToken ?? undefined,
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
finally {
|
|
476
|
+
browser.disconnect();
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* teams-api CLI
|
|
4
|
+
*
|
|
5
|
+
* Thin adapter that maps unified action definitions to CLI commands.
|
|
6
|
+
* All commands, parameters, descriptions, and execution logic come
|
|
7
|
+
* from `src/actions.ts` — the single source of truth.
|
|
8
|
+
*
|
|
9
|
+
* Special commands (auth, logout) are defined here directly since
|
|
10
|
+
* they handle authentication rather than Teams data operations.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
|