Skip to content

Commit 40e948b

Browse files
committed
merge: 🔀 merge PR #255 and local docs updates
- Merge PR #255: fix login page redirect when switching account - Update tools documentation (add callCloudApi, update version to 2.5.0) - Add new IDE support (qoder, antigravity, kiro) - Preserve existing setupContext and debug logging functionality
2 parents 1240ca1 + 926596b commit 40e948b

3 files changed

Lines changed: 60 additions & 40 deletions

File tree

mcp/src/auth.ts

Lines changed: 41 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,46 @@
1-
import { AuthSupevisor } from '@cloudbase/toolbox';
2-
import { debug } from './utils/logger.js';
1+
import { AuthSupevisor } from "@cloudbase/toolbox";
2+
import { debug } from "./utils/logger.js";
33

4-
const auth = AuthSupevisor.getInstance({
5-
})
4+
const auth = AuthSupevisor.getInstance({});
65

7-
export async function getLoginState() {
8-
const {
9-
TENCENTCLOUD_SECRETID,
10-
TENCENTCLOUD_SECRETKEY,
11-
TENCENTCLOUD_SESSIONTOKEN
12-
} = process.env
13-
debug('TENCENTCLOUD_SECRETID', { secretId: TENCENTCLOUD_SECRETID })
14-
if (TENCENTCLOUD_SECRETID && TENCENTCLOUD_SECRETKEY) {
15-
debug('loginByApiSecret')
16-
return {
17-
secretId: TENCENTCLOUD_SECRETID,
18-
secretKey: TENCENTCLOUD_SECRETKEY,
19-
token: TENCENTCLOUD_SESSIONTOKEN
20-
}
21-
// await auth.loginByApiSecret(TENCENTCLOUD_SECRETID, TENCENTCLOUD_SECRETKEY, TENCENTCLOUD_SESSIONTOKEN)
22-
}
23-
24-
const loginState = await auth.getLoginState()
25-
if (!loginState) {
26-
await auth.loginByWebAuth({})
27-
const loginState = await auth.getLoginState()
28-
debug('loginByWebAuth',loginState)
29-
return loginState
30-
} else {
31-
return loginState
32-
}
6+
export async function getLoginState(options?: {
7+
fromCloudBaseLoginPage?: boolean;
8+
}) {
9+
const {
10+
TENCENTCLOUD_SECRETID,
11+
TENCENTCLOUD_SECRETKEY,
12+
TENCENTCLOUD_SESSIONTOKEN,
13+
} = process.env;
14+
debug("TENCENTCLOUD_SECRETID", { secretId: TENCENTCLOUD_SECRETID });
15+
if (TENCENTCLOUD_SECRETID && TENCENTCLOUD_SECRETKEY) {
16+
debug("loginByApiSecret");
17+
return {
18+
secretId: TENCENTCLOUD_SECRETID,
19+
secretKey: TENCENTCLOUD_SECRETKEY,
20+
token: TENCENTCLOUD_SESSIONTOKEN,
21+
};
22+
// await auth.loginByApiSecret(TENCENTCLOUD_SECRETID, TENCENTCLOUD_SECRETKEY, TENCENTCLOUD_SESSIONTOKEN)
23+
}
24+
25+
const loginState = await auth.getLoginState();
26+
if (!loginState) {
27+
await auth.loginByWebAuth(
28+
options?.fromCloudBaseLoginPage
29+
? {
30+
getAuthUrl: (url) =>
31+
`https://tcb.cloud.tencent.com/login?_redirect_uri=${encodeURIComponent(url)}`,
32+
}
33+
: {},
34+
);
35+
const loginState = await auth.getLoginState();
36+
debug("loginByWebAuth", loginState);
37+
return loginState;
38+
} else {
39+
return loginState;
40+
}
3341
}
3442

3543
export async function logout() {
36-
const result = await auth.logout()
37-
return result
38-
}
44+
const result = await auth.logout();
45+
return result;
46+
}

mcp/src/tools/env.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ export function registerEnvTools(server: ExtendedMcpServer) {
3535
},
3636
},
3737
async ({ forceUpdate = false }: { forceUpdate?: boolean }) => {
38+
let isSwitching = false;
39+
3840
try {
3941
// 使用 while 循环处理用户切换账号的情况
4042
while (true) {
@@ -44,7 +46,12 @@ export function registerEnvTools(server: ExtendedMcpServer) {
4446
error,
4547
noEnvs,
4648
switch: switchAccount,
47-
} = await _promptAndSetEnvironmentId(forceUpdate, server);
49+
} = await _promptAndSetEnvironmentId(forceUpdate, {
50+
server,
51+
loginFromCloudBaseLoginPage: isSwitching,
52+
});
53+
54+
isSwitching = Boolean(switchAccount);
4855

4956
debug("login", {
5057
selectedEnvId,

mcp/src/tools/interactive.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -195,30 +195,35 @@ export function registerInteractiveTools(server: ExtendedMcpServer) {
195195
// 封装了获取环境、提示选择、保存配置的核心逻辑
196196
export async function _promptAndSetEnvironmentId(
197197
autoSelectSingle: boolean,
198-
server?: any,
198+
options?: { server?: any; loginFromCloudBaseLoginPage?: boolean },
199199
): Promise<{
200200
selectedEnvId: string | null;
201201
cancelled: boolean;
202202
error?: string;
203203
noEnvs?: boolean;
204204
switch?: boolean;
205205
}> {
206+
const server = options?.server;
207+
206208
// Initialize setup context for auto-provisioning flow
207209
let setupContext: EnvSetupContext = {};
208210

209211
debug("[interactive] Starting _promptAndSetEnvironmentId", {
210212
autoSelectSingle,
211-
hasServer: !!server
213+
hasServer: !!server,
212214
});
213215

214216
// 1. 确保用户已登录
215217
debug("[interactive] Step 1: Checking login state...");
216-
const loginState = await getLoginState();
217-
debug("[interactive] Login state:", {
218+
const loginState = await getLoginState({
219+
fromCloudBaseLoginPage: options?.loginFromCloudBaseLoginPage,
220+
});
221+
debug("[interactive] Login state:", {
218222
hasLoginState: !!loginState,
219-
hasUin: !!(loginState && typeof loginState === "object" && "uin" in loginState)
223+
hasUin: !!(
224+
loginState && typeof loginState === "object" && "uin" in loginState
225+
),
220226
});
221-
222227
if (!loginState) {
223228
debug("[interactive] User not logged in");
224229
return {

0 commit comments

Comments
 (0)