@cloudbase/cloudbase-mcp 2.29.0 → 2.30.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/dist/cli.cjs +3 -3
- package/dist/index.cjs +233 -70
- package/dist/index.js +233 -70
- package/package.json +1 -1
- package/server.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -3329,6 +3329,7 @@ const zod_1 = __webpack_require__(7552);
|
|
|
3329
3329
|
const auth_js_1 = __webpack_require__(77291);
|
|
3330
3330
|
const cloudbase_manager_js_1 = __webpack_require__(3431);
|
|
3331
3331
|
const logger_js_1 = __webpack_require__(13039);
|
|
3332
|
+
const site_map_js_1 = __webpack_require__(68107);
|
|
3332
3333
|
const tool_result_js_1 = __webpack_require__(9835);
|
|
3333
3334
|
const gateway_access_urls_js_1 = __webpack_require__(22435);
|
|
3334
3335
|
const env_setup_js_1 = __webpack_require__(6978);
|
|
@@ -3811,6 +3812,45 @@ async function fetchAvailableEnvCandidates(cloudBaseOptions, server) {
|
|
|
3811
3812
|
return [];
|
|
3812
3813
|
}
|
|
3813
3814
|
}
|
|
3815
|
+
async function fetchAccountEnvCandidates(cloudBaseOptions) {
|
|
3816
|
+
try {
|
|
3817
|
+
return await (0, cloudbase_manager_js_1.listAvailableEnvCandidates)({
|
|
3818
|
+
cloudBaseOptions,
|
|
3819
|
+
ignorePinnedEnvId: true,
|
|
3820
|
+
});
|
|
3821
|
+
}
|
|
3822
|
+
catch {
|
|
3823
|
+
return [];
|
|
3824
|
+
}
|
|
3825
|
+
}
|
|
3826
|
+
function isApiKeyCredentialMode() {
|
|
3827
|
+
return Boolean((0, auth_js_1.getCloudBaseApiKeyFromEnv)() && process.env.CLOUDBASE_ENV_ID);
|
|
3828
|
+
}
|
|
3829
|
+
function getCredentialScope() {
|
|
3830
|
+
return isApiKeyCredentialMode() ? "single_env" : "account";
|
|
3831
|
+
}
|
|
3832
|
+
function buildCredentialBoundaryPayload(cloudBaseOptions) {
|
|
3833
|
+
const credentialScope = getCredentialScope();
|
|
3834
|
+
const currentRegion = (0, site_map_js_1.resolveSiteAndRegion)(cloudBaseOptions ?? {}).region;
|
|
3835
|
+
const pinnedEnvId = process.env.CLOUDBASE_ENV_ID || cloudBaseOptions?.envId || null;
|
|
3836
|
+
const scopeNote = credentialScope === "single_env"
|
|
3837
|
+
? `当前为环境级 API Key 登录(单环境权限)。只能访问已绑定的 envId${pinnedEnvId ? ` ${pinnedEnvId}` : ""},看不到账号下其他环境或其他地域。这是凭据权限边界,不是环境不存在。`
|
|
3838
|
+
: `当前为账号级登录。DescribeEnvs 按地域查询;未传 region 时使用当前地域 ${currentRegion}。其他地域请用 queryEnv(action="list", region="ap-singapore"),或 CLI: tcb env list -r ap-singapore。`;
|
|
3839
|
+
return {
|
|
3840
|
+
credential_scope: credentialScope,
|
|
3841
|
+
current_region: currentRegion,
|
|
3842
|
+
scope_note: scopeNote,
|
|
3843
|
+
};
|
|
3844
|
+
}
|
|
3845
|
+
function applyBoundEnvRegion(server, region) {
|
|
3846
|
+
if (!region) {
|
|
3847
|
+
return;
|
|
3848
|
+
}
|
|
3849
|
+
process.env.TCB_REGION = region;
|
|
3850
|
+
if (server.cloudBaseOptions) {
|
|
3851
|
+
server.cloudBaseOptions.region = region;
|
|
3852
|
+
}
|
|
3853
|
+
}
|
|
3814
3854
|
const CODEBUDDY_AUTH_ACTIONS = ["status", "set_env", "login_by_api_key"];
|
|
3815
3855
|
const DEFAULT_AUTH_ACTIONS = [
|
|
3816
3856
|
"status",
|
|
@@ -4041,7 +4081,10 @@ async function prepareAuthEnvironment(params) {
|
|
|
4041
4081
|
}
|
|
4042
4082
|
function buildEnvQueryListResult(params) {
|
|
4043
4083
|
const envList = Array.isArray(params.result?.EnvList) ? params.result.EnvList : [];
|
|
4044
|
-
const shouldRestrictToCurrentEnv = params.hasEnvId &&
|
|
4084
|
+
const shouldRestrictToCurrentEnv = params.hasEnvId &&
|
|
4085
|
+
!params.filters.alias &&
|
|
4086
|
+
!params.filters.envId &&
|
|
4087
|
+
!params.filters.region;
|
|
4045
4088
|
const baseList = shouldRestrictToCurrentEnv
|
|
4046
4089
|
? envList.filter((env) => env.EnvId === params.cloudBaseOptions?.envId)
|
|
4047
4090
|
: envList;
|
|
@@ -4058,6 +4101,11 @@ function buildEnvQueryListResult(params) {
|
|
|
4058
4101
|
reason: "action=list with envId only returns a concise summary. Use action=info to fetch detailed environment information such as full resource metadata and additional environment details.",
|
|
4059
4102
|
}
|
|
4060
4103
|
: undefined;
|
|
4104
|
+
const credentialBoundary = buildCredentialBoundaryPayload(params.cloudBaseOptions);
|
|
4105
|
+
const queryRegion = params.filters.region || credentialBoundary.current_region;
|
|
4106
|
+
const currentEnvOnlyNote = shouldRestrictToCurrentEnv && credentialBoundary.credential_scope === "account"
|
|
4107
|
+
? `已绑定环境,list 默认只返回当前环境。要查看其他地域请传 region(例如 region="ap-singapore"),或使用 CLI: tcb env list -r ap-singapore。`
|
|
4108
|
+
: undefined;
|
|
4061
4109
|
return {
|
|
4062
4110
|
EnvList: paginated.items.map((env) => selectEnvFields(env, params.filters.fields)),
|
|
4063
4111
|
TotalCount: paginated.total,
|
|
@@ -4068,9 +4116,13 @@ function buildEnvQueryListResult(params) {
|
|
|
4068
4116
|
alias: params.filters.alias ?? null,
|
|
4069
4117
|
aliasExact: params.filters.aliasExact ?? null,
|
|
4070
4118
|
envId: params.filters.envId ?? null,
|
|
4119
|
+
region: params.filters.region ?? null,
|
|
4071
4120
|
fields: params.filters.fields ?? [...DEFAULT_ENV_FIELDS],
|
|
4072
4121
|
currentEnvOnly: shouldRestrictToCurrentEnv,
|
|
4073
4122
|
},
|
|
4123
|
+
...credentialBoundary,
|
|
4124
|
+
query_region: queryRegion,
|
|
4125
|
+
...(currentEnvOnlyNote ? { scope_note: currentEnvOnlyNote } : {}),
|
|
4074
4126
|
...(exactEnvIdSummaryHint
|
|
4075
4127
|
? {
|
|
4076
4128
|
RecommendedNextAction: exactEnvIdSummaryHint,
|
|
@@ -4776,13 +4828,14 @@ function registerEnvTools(server) {
|
|
|
4776
4828
|
requireEnvId: options?.requireEnvId ?? true,
|
|
4777
4829
|
mcpServer: server,
|
|
4778
4830
|
});
|
|
4779
|
-
const getManagerForEnvQuery = (targetEnvId, requireEnvId = true) => (0, cloudbase_manager_js_1.getCloudBaseManager)({
|
|
4780
|
-
cloudBaseOptions:
|
|
4781
|
-
|
|
4782
|
-
|
|
4783
|
-
envId: targetEnvId
|
|
4784
|
-
|
|
4785
|
-
:
|
|
4831
|
+
const getManagerForEnvQuery = (targetEnvId, requireEnvId = true, region) => (0, cloudbase_manager_js_1.getCloudBaseManager)({
|
|
4832
|
+
cloudBaseOptions: {
|
|
4833
|
+
...cloudBaseOptions,
|
|
4834
|
+
...(targetEnvId && targetEnvId !== cloudBaseOptions?.envId
|
|
4835
|
+
? { envId: targetEnvId }
|
|
4836
|
+
: {}),
|
|
4837
|
+
...(region ? { region } : {}),
|
|
4838
|
+
},
|
|
4786
4839
|
requireEnvId,
|
|
4787
4840
|
mcpServer: server,
|
|
4788
4841
|
});
|
|
@@ -4794,7 +4847,7 @@ function registerEnvTools(server) {
|
|
|
4794
4847
|
if (server.ide !== 'wxide') {
|
|
4795
4848
|
server.registerTool?.("auth", {
|
|
4796
4849
|
title: "CloudBase 开发阶段登录与环境",
|
|
4797
|
-
description: "CloudBase(腾讯云开发)开发阶段登录与环境绑定。登录后即可访问云资源;环境(env)是云函数、数据库、静态托管等资源的隔离单元,绑定环境后其他 MCP 工具才能操作该环境。支持:查询状态、发起登录、API Key登录、绑定环境(set_env)、退出登录。",
|
|
4850
|
+
description: "CloudBase(腾讯云开发)开发阶段登录与环境绑定。登录后即可访问云资源;环境(env)是云函数、数据库、静态托管等资源的隔离单元,绑定环境后其他 MCP 工具才能操作该环境。支持:查询状态、发起登录、API Key登录、绑定环境(set_env)、退出登录。auth(status) 会返回 credential_scope(account=账号级 / single_env=环境级 API Key)与当前 region;环境级 API Key 只能看到绑定的 envId,查不到其他地域环境是权限边界而非环境不存在。",
|
|
4798
4851
|
inputSchema: {
|
|
4799
4852
|
action: zod_1.z
|
|
4800
4853
|
.enum(authActionEnum)
|
|
@@ -4908,13 +4961,7 @@ function registerEnvTools(server) {
|
|
|
4908
4961
|
? "PENDING"
|
|
4909
4962
|
: "REQUIRED";
|
|
4910
4963
|
let envPreparation;
|
|
4911
|
-
const
|
|
4912
|
-
? undefined
|
|
4913
|
-
: authStatus === "PENDING"
|
|
4914
|
-
? "设备码授权进行中,请完成浏览器授权后再次调用 auth(action=\"status\")"
|
|
4915
|
-
: isCodeBuddyIde(server)
|
|
4916
|
-
? "当前未登录。CodeBuddy 暂不支持在 tool 内发起认证,请在外部完成认证后再次调用 auth(action=\"status\")。"
|
|
4917
|
-
: "当前未登录,请先执行 auth(action=\"start_auth\")";
|
|
4964
|
+
const credentialBoundary = buildCredentialBoundaryPayload(cloudBaseOptions);
|
|
4918
4965
|
if (authStatus === "READY" && loginState) {
|
|
4919
4966
|
envPreparation = await prepareAuthEnvironment({
|
|
4920
4967
|
server,
|
|
@@ -4922,11 +4969,21 @@ function registerEnvTools(server) {
|
|
|
4922
4969
|
loginState,
|
|
4923
4970
|
});
|
|
4924
4971
|
}
|
|
4972
|
+
const statusMessage = authStatus === "READY"
|
|
4973
|
+
? envPreparation?.message
|
|
4974
|
+
? `${envPreparation.message} ${credentialBoundary.scope_note}`
|
|
4975
|
+
: credentialBoundary.scope_note
|
|
4976
|
+
: authStatus === "PENDING"
|
|
4977
|
+
? "设备码授权进行中,请完成浏览器授权后再次调用 auth(action=\"status\")"
|
|
4978
|
+
: isCodeBuddyIde(server)
|
|
4979
|
+
? "当前未登录。CodeBuddy 暂不支持在 tool 内发起认证,请在外部完成认证后再次调用 auth(action=\"status\")。"
|
|
4980
|
+
: "当前未登录,请先执行 auth(action=\"start_auth\")";
|
|
4925
4981
|
return (0, tool_result_js_1.buildJsonToolResult)({
|
|
4926
4982
|
ok: true,
|
|
4927
4983
|
code: "STATUS",
|
|
4928
4984
|
auth_status: authStatus,
|
|
4929
4985
|
...(isApiKeyMode ? { auth_mode: "api_key" } : {}),
|
|
4986
|
+
...credentialBoundary,
|
|
4930
4987
|
auth_config: authConfigSummary,
|
|
4931
4988
|
...(envPreparation
|
|
4932
4989
|
? buildAuthEnvSetupPayload(envPreparation)
|
|
@@ -4938,7 +4995,7 @@ function registerEnvTools(server) {
|
|
|
4938
4995
|
auth_challenge: authFlowState.status === "PENDING"
|
|
4939
4996
|
? (0, auth_js_1.buildDeviceAuthChallengePayload)(authFlowState.authChallenge)
|
|
4940
4997
|
: undefined,
|
|
4941
|
-
message,
|
|
4998
|
+
message: statusMessage,
|
|
4942
4999
|
next_step: authStatus === "REQUIRED"
|
|
4943
5000
|
? buildAuthRequiredNextStep(server)
|
|
4944
5001
|
: authStatus === "PENDING"
|
|
@@ -5236,32 +5293,63 @@ function registerEnvTools(server) {
|
|
|
5236
5293
|
next_step: buildAuthRequiredNextStep(server),
|
|
5237
5294
|
});
|
|
5238
5295
|
}
|
|
5239
|
-
const
|
|
5296
|
+
const credentialBoundary = buildCredentialBoundaryPayload(cloudBaseOptions);
|
|
5297
|
+
const envCandidates = isApiKeyCredentialMode()
|
|
5298
|
+
? await fetchAvailableEnvCandidates(cloudBaseOptions, server)
|
|
5299
|
+
: await fetchAccountEnvCandidates(cloudBaseOptions);
|
|
5240
5300
|
if (!envId) {
|
|
5241
5301
|
return (0, tool_result_js_1.buildJsonToolResult)({
|
|
5242
5302
|
ok: false,
|
|
5243
5303
|
code: "INVALID_ARGS",
|
|
5244
5304
|
message: "action=set_env 时必须提供 envId",
|
|
5305
|
+
...credentialBoundary,
|
|
5245
5306
|
...buildEnvCandidatePayload(envCandidates),
|
|
5246
5307
|
next_step: buildSetEnvNextStep(envCandidates),
|
|
5247
5308
|
});
|
|
5248
5309
|
}
|
|
5249
|
-
|
|
5250
|
-
|
|
5310
|
+
if (isApiKeyCredentialMode()) {
|
|
5311
|
+
const pinnedEnvId = process.env.CLOUDBASE_ENV_ID;
|
|
5312
|
+
if (pinnedEnvId && envId !== pinnedEnvId) {
|
|
5313
|
+
return (0, tool_result_js_1.buildJsonToolResult)({
|
|
5314
|
+
ok: false,
|
|
5315
|
+
code: "CREDENTIAL_SCOPE_LIMITED",
|
|
5316
|
+
message: `当前为环境级 API Key 登录,只能绑定已授权环境 ${pinnedEnvId},不能切换到 ${envId}。这是凭据权限边界,不是目标环境不存在。`,
|
|
5317
|
+
...credentialBoundary,
|
|
5318
|
+
current_env_id: pinnedEnvId,
|
|
5319
|
+
...buildEnvCandidatePayload(envCandidates),
|
|
5320
|
+
});
|
|
5321
|
+
}
|
|
5322
|
+
await cloudbase_manager_js_1.envManager.setEnvId(envId);
|
|
5251
5323
|
return (0, tool_result_js_1.buildJsonToolResult)({
|
|
5252
|
-
ok:
|
|
5253
|
-
code: "
|
|
5254
|
-
message:
|
|
5255
|
-
|
|
5256
|
-
|
|
5324
|
+
ok: true,
|
|
5325
|
+
code: "ENV_READY",
|
|
5326
|
+
message: `环境设置成功,当前环境: ${envId}`,
|
|
5327
|
+
current_env_id: envId,
|
|
5328
|
+
...credentialBoundary,
|
|
5329
|
+
});
|
|
5330
|
+
}
|
|
5331
|
+
let target = envCandidates.find((item) => item.envId === envId);
|
|
5332
|
+
if (!target) {
|
|
5333
|
+
target = await (0, cloudbase_manager_js_1.resolveEnvCandidateByEnvId)({
|
|
5334
|
+
envId,
|
|
5335
|
+
cloudBaseOptions,
|
|
5336
|
+
loginState,
|
|
5257
5337
|
});
|
|
5258
5338
|
}
|
|
5259
5339
|
await cloudbase_manager_js_1.envManager.setEnvId(envId);
|
|
5340
|
+
applyBoundEnvRegion(server, target?.region);
|
|
5341
|
+
const regionHint = target?.region
|
|
5342
|
+
? `,地域: ${target.region}`
|
|
5343
|
+
: target
|
|
5344
|
+
? ""
|
|
5345
|
+
: "。未在当前探测地域中确认该 envId,已按唯一 ID 直绑;若后续接口仍指向错误地域,请设置 TCB_REGION 或 queryEnv(action=\"list\", region=...)";
|
|
5260
5346
|
return (0, tool_result_js_1.buildJsonToolResult)({
|
|
5261
5347
|
ok: true,
|
|
5262
5348
|
code: "ENV_READY",
|
|
5263
|
-
message: `环境设置成功,当前环境: ${envId}`,
|
|
5349
|
+
message: `环境设置成功,当前环境: ${envId}${regionHint}`,
|
|
5350
|
+
...credentialBoundary,
|
|
5264
5351
|
current_env_id: envId,
|
|
5352
|
+
current_region: target?.region || credentialBoundary.current_region,
|
|
5265
5353
|
});
|
|
5266
5354
|
}
|
|
5267
5355
|
if (action === "logout") {
|
|
@@ -5368,23 +5456,20 @@ function registerEnvTools(server) {
|
|
|
5368
5456
|
});
|
|
5369
5457
|
} // end: wxide guard for auth tool
|
|
5370
5458
|
// queryEnv - 环境查询(合并 listEnvs + getEnvInfo + getEnvAuthDomains + usage + metrics)
|
|
5371
|
-
const queryEnvHandler = async ({ action, alias, aliasExact, envId, limit, offset, fields, type, startDate, endDate, needUsageDetails, metricName, startTime, endTime, period, resourceID, subresourceID, }) => {
|
|
5459
|
+
const queryEnvHandler = async ({ action, alias, aliasExact, envId, region, limit, offset, fields, type, startDate, endDate, needUsageDetails, metricName, startTime, endTime, period, resourceID, subresourceID, }) => {
|
|
5372
5460
|
try {
|
|
5373
5461
|
let result;
|
|
5374
5462
|
switch (action) {
|
|
5375
5463
|
case "list":
|
|
5376
5464
|
try {
|
|
5377
|
-
const cloudbaseList = await (
|
|
5378
|
-
|
|
5379
|
-
|
|
5380
|
-
|
|
5381
|
-
});
|
|
5382
|
-
// 当环境变量设置了 CLOUDBASE_ENV_ID 时(如 API Key 模式),
|
|
5383
|
-
// 避免调用 DescribeEnvs(临时密钥可能不支持该接口),
|
|
5384
|
-
// 改为通过 DescribeEnvInfo 获取单环境信息
|
|
5385
|
-
// 注意:requestFn 模式(如微信 IDE)使用 DescribeEnvs,不走此分支
|
|
5465
|
+
const cloudbaseList = await getManagerForEnvQuery(undefined, false, region);
|
|
5466
|
+
// API Key / env-var pin: skip DescribeEnvs (STS often cannot list).
|
|
5467
|
+
// Account-level sessions that only pinned CLOUDBASE_ENV_ID via set_env
|
|
5468
|
+
// can still pass region/alias/envId to list other environments.
|
|
5386
5469
|
const envIdFromEnv = !cloudBaseOptions?.requestFn && process.env.CLOUDBASE_ENV_ID;
|
|
5387
|
-
|
|
5470
|
+
const shouldPinToEnvVar = Boolean(envIdFromEnv &&
|
|
5471
|
+
(isApiKeyCredentialMode() || (!region && !alias && !envId)));
|
|
5472
|
+
if (shouldPinToEnvVar && envIdFromEnv) {
|
|
5388
5473
|
try {
|
|
5389
5474
|
const envInfo = await cloudbaseList.env.describeEnvInfo({ EnvId: envIdFromEnv });
|
|
5390
5475
|
(0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, envInfo);
|
|
@@ -5438,11 +5523,7 @@ function registerEnvTools(server) {
|
|
|
5438
5523
|
(0, logger_js_1.debug)("获取环境列表时出错,尝试降级到 listEnvs():", error instanceof Error ? error : new Error(String(error)));
|
|
5439
5524
|
// Fallback to original method on error
|
|
5440
5525
|
try {
|
|
5441
|
-
const cloudbaseList = await (
|
|
5442
|
-
cloudBaseOptions,
|
|
5443
|
-
requireEnvId: true,
|
|
5444
|
-
mcpServer: server, // Pass server for IDE detection
|
|
5445
|
-
});
|
|
5526
|
+
const cloudbaseList = await getManagerForEnvQuery(undefined, false, region);
|
|
5446
5527
|
result = await cloudbaseList.env.listEnvs();
|
|
5447
5528
|
(0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, result);
|
|
5448
5529
|
}
|
|
@@ -5471,6 +5552,7 @@ function registerEnvTools(server) {
|
|
|
5471
5552
|
alias,
|
|
5472
5553
|
aliasExact,
|
|
5473
5554
|
envId,
|
|
5555
|
+
region,
|
|
5474
5556
|
limit,
|
|
5475
5557
|
offset,
|
|
5476
5558
|
fields,
|
|
@@ -5650,17 +5732,21 @@ function registerEnvTools(server) {
|
|
|
5650
5732
|
// Register primary tool name (queryEnv)
|
|
5651
5733
|
const queryEnvToolSchema = {
|
|
5652
5734
|
title: "CloudBase 环境查询",
|
|
5653
|
-
description: "查询 CloudBase 环境相关信息,支持查询环境列表、指定环境详情、安全域名、资源用量与监控指标。(曾用名:envQuery、listEnvs、getEnvInfo、getEnvAuthDomains)当 action=list 时,会按 DescribeEnvs 语义做列表/筛选,标准返回字段为 EnvId、Alias、Status、EnvType、Region、PackageId、PackageName、IsDefault,并支持通过 fields 白名单裁剪这些字段;aliasExact=true 时会按别名精确筛选,避免把前缀相近的环境误当作候选;即使传入 envId,action=list 也只返回摘要,不会返回完整资源明细或 expiry
|
|
5735
|
+
description: "查询 CloudBase 环境相关信息,支持查询环境列表、指定环境详情、安全域名、资源用量与监控指标。(曾用名:envQuery、listEnvs、getEnvInfo、getEnvAuthDomains)当 action=list 时,会按 DescribeEnvs 语义做列表/筛选,标准返回字段为 EnvId、Alias、Status、EnvType、Region、PackageId、PackageName、IsDefault,并支持通过 fields 白名单裁剪这些字段;aliasExact=true 时会按别名精确筛选,避免把前缀相近的环境误当作候选;即使传入 envId,action=list 也只返回摘要,不会返回完整资源明细或 expiry。账号级登录可传 region(ap-shanghai/ap-guangzhou/ap-singapore)查询对应地域,对齐 CLI `tcb env list -r <region>`;环境级 API Key 只能看到绑定的 envId,返回 credential_scope=single_env,不要误判为环境不存在。如需查询某个已知 EnvId 对应环境的详细信息(包括资源字段和计费信息),必须使用 action=info 并传入目标环境的 envId 参数。action=info 会在可用时补充 BillingInfo(如 ExpireTime、PayMode、IsAutoRenew 等计费字段)。\n\n📊 action=usage 对齐 tcb env usage/info:透传 Manager SDK describeEnvAccountCircle + describeCreditsUsageDetail,返回计费周期与各模块资源点用量(FLEXDB/SCF/COS 等)。envId 必填;type 可选过滤模块;未传 startDate/endDate 时自动使用当前计费周期。\n\n📈 action=metrics 对齐 TCB DescribeCurveData(manager.monitor.describeCurveData,不是云监控 GetMonitorData):查询环境/网关 QPS、云函数调用与错误、数据库 CPU/内存/磁盘、云托管 CPU/QPS 等时序。envId 与 metricName 必填;startTime/endTime 格式 YYYY-MM-DD HH:mm:ss,须成对传入,不传则默认最近 24 小时;period 仅 300/3600/86400。GatewayTraceEnvQPS 未传 resourceID 时自动填环境级 all|:|all|:|all|:|all;云托管 Tke* 指标必须传服务名 resourceID。禁止用 callCloudApi 猜测监控 Action。\n\n🔍 action=info 还会派生三个用于后端选型的字段:\n- `EnvInfo.RuntimeMode`:'postgresql' 或 'nosql',表示新业务建议默认使用的后端(PG 已开通时为 postgresql,否则为 nosql)。\n- `EnvInfo.RuntimeBackends`:`{postgresql, nosql, mysql}` 三个布尔值,描述当前环境实际并存的后端。\n- `EnvInfo.RuntimeModeHints`:每个后端对应的 API/工具/skill 提示。\n\n🌐 action=info 还会在不改写 `StaticStorages[].StaticDomain`(云 API 名义域名)的前提下,投影网关路由 Enable 状态:`StaticStorages[].staticDomainRouteEnabled` 与 `EnvInfo.staticDomainRouteEnabled`(与 queryHosting websiteConfig 同源)。`false` 表示默认静态域名根路由已禁用(访问会返回 GATEWAY_ROUTE_DISABLED),勿把名义域名当成可达 URL。\n\nAI 在写业务/权限/存储代码前必须先看这三项:PG 模式下新业务推荐 `app.rdb()` + RLS(`managePgDatabase action=execute` 跑 `CREATE POLICY`)+ pgstore;已存在的 NoSQL 集合 / 旧 storage / `managePermissions(resourceType=\"noSqlDatabase\")` 在 PG 环境下仍然有效。真正不适用的是 MySQL:当 `RuntimeBackends.mysql === false` 时,`manageMysqlDatabase` / `queryMysqlDatabase` / `relational-database-mcp-cloudbase` skill 都不该使用。",
|
|
5654
5736
|
inputSchema: {
|
|
5655
5737
|
action: zod_1.z
|
|
5656
5738
|
.enum(["list", "info", "domains", "usage", "metrics"])
|
|
5657
|
-
.describe("查询类型:list=环境列表/摘要筛选(按 DescribeEnvs 语义筛选,支持通过 envId 筛选,返回 EnvId、Alias、Status、EnvType、Region、PackageId、PackageName、IsDefault,不支持 expiry),info=指定环境的详细信息(必须传入 envId,返回资源字段和计费信息),domains=安全域名列表,usage=环境资源用量(必须传入 envId,对齐 tcb env usage/info),metrics=环境监控时序(必须传入 envId 与 metricName,对齐 TCB DescribeCurveData)"),
|
|
5739
|
+
.describe("查询类型:list=环境列表/摘要筛选(按 DescribeEnvs 语义筛选,支持通过 envId / region 筛选,返回 EnvId、Alias、Status、EnvType、Region、PackageId、PackageName、IsDefault,不支持 expiry),info=指定环境的详细信息(必须传入 envId,返回资源字段和计费信息),domains=安全域名列表,usage=环境资源用量(必须传入 envId,对齐 tcb env usage/info),metrics=环境监控时序(必须传入 envId 与 metricName,对齐 TCB DescribeCurveData)"),
|
|
5658
5740
|
alias: zod_1.z.string().optional().describe("按环境别名筛选。action=list 时可选"),
|
|
5659
5741
|
aliasExact: zod_1.z.boolean().optional().describe("按环境别名精确筛选。action=list 时可选;与 alias 配合使用"),
|
|
5660
5742
|
envId: zod_1.z
|
|
5661
5743
|
.string()
|
|
5662
5744
|
.optional()
|
|
5663
5745
|
.describe("环境 ID。action=list 时可选(仅按 DescribeEnvs 语义做筛选,仍返回摘要);action=info / action=usage / action=metrics 时必填。"),
|
|
5746
|
+
region: zod_1.z
|
|
5747
|
+
.enum(site_map_js_1.TCB_QUERY_REGIONS)
|
|
5748
|
+
.optional()
|
|
5749
|
+
.describe("查询地域。仅 action=list 时有效。账号级凭据会把该值透传到 DescribeEnvs(X-TC-Region),例如 ap-singapore。环境级 API Key 无法用此参数看到其他环境。等价 CLI:tcb env list -r <region> --json。"),
|
|
5664
5750
|
limit: zod_1.z.number().int().positive().optional().describe("返回数量上限。action=list 时可选"),
|
|
5665
5751
|
offset: zod_1.z.number().int().min(0).optional().describe("分页偏移。action=list 时可选"),
|
|
5666
5752
|
fields: zod_1.z
|
|
@@ -28830,6 +28916,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
28830
28916
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
28831
28917
|
exports.envManager = void 0;
|
|
28832
28918
|
exports.listAvailableEnvCandidates = listAvailableEnvCandidates;
|
|
28919
|
+
exports.resolveEnvCandidateByEnvId = resolveEnvCandidateByEnvId;
|
|
28833
28920
|
exports.getEnvId = getEnvId;
|
|
28834
28921
|
exports.resetCloudBaseManagerCache = resetCloudBaseManagerCache;
|
|
28835
28922
|
exports.getCachedEnvId = getCachedEnvId;
|
|
@@ -28873,31 +28960,39 @@ function createManagerFromLoginState(loginState, region) {
|
|
|
28873
28960
|
});
|
|
28874
28961
|
}
|
|
28875
28962
|
async function listAvailableEnvCandidates(options) {
|
|
28876
|
-
const { cloudBaseOptions, loginState: providedLoginState } = options ?? {};
|
|
28877
|
-
|
|
28878
|
-
|
|
28879
|
-
|
|
28880
|
-
|
|
28881
|
-
|
|
28882
|
-
|
|
28883
|
-
|
|
28884
|
-
|
|
28885
|
-
|
|
28886
|
-
|
|
28887
|
-
|
|
28888
|
-
|
|
28889
|
-
|
|
28963
|
+
const { cloudBaseOptions, loginState: providedLoginState, region: regionOverride, ignorePinnedEnvId, } = options ?? {};
|
|
28964
|
+
if (!ignorePinnedEnvId) {
|
|
28965
|
+
// Prefer an explicit envId pin (bound session / API Key).
|
|
28966
|
+
if (cloudBaseOptions?.envId) {
|
|
28967
|
+
return [{
|
|
28968
|
+
envId: cloudBaseOptions.envId,
|
|
28969
|
+
region: cloudBaseOptions.region,
|
|
28970
|
+
}];
|
|
28971
|
+
}
|
|
28972
|
+
// When CLOUDBASE_ENV_ID is set and credentials are not explicit, skip DescribeEnvs.
|
|
28973
|
+
const hasExplicitCredentials = !!(cloudBaseOptions?.secretId && cloudBaseOptions?.secretKey);
|
|
28974
|
+
if (process.env.CLOUDBASE_ENV_ID && !hasExplicitCredentials) {
|
|
28975
|
+
return [{
|
|
28976
|
+
envId: process.env.CLOUDBASE_ENV_ID,
|
|
28977
|
+
}];
|
|
28978
|
+
}
|
|
28890
28979
|
}
|
|
28980
|
+
const region = (0, site_map_js_1.resolveSiteAndRegion)({
|
|
28981
|
+
...(cloudBaseOptions ?? {}),
|
|
28982
|
+
...(regionOverride ? { region: regionOverride } : {}),
|
|
28983
|
+
}).region;
|
|
28891
28984
|
let cloudbase;
|
|
28892
28985
|
if (cloudBaseOptions?.secretId && cloudBaseOptions?.secretKey) {
|
|
28893
|
-
cloudbase = createCloudBaseManagerWithOptions(
|
|
28986
|
+
cloudbase = createCloudBaseManagerWithOptions({
|
|
28987
|
+
...cloudBaseOptions,
|
|
28988
|
+
region,
|
|
28989
|
+
});
|
|
28894
28990
|
}
|
|
28895
28991
|
else {
|
|
28896
28992
|
const loginState = providedLoginState ?? await (0, auth_js_1.peekLoginState)();
|
|
28897
28993
|
if (!loginState?.secretId || !loginState?.secretKey) {
|
|
28898
28994
|
return [];
|
|
28899
28995
|
}
|
|
28900
|
-
const region = (0, site_map_js_1.resolveSiteAndRegion)(cloudBaseOptions ?? {}).region;
|
|
28901
28996
|
cloudbase = createManagerFromLoginState(loginState, region);
|
|
28902
28997
|
}
|
|
28903
28998
|
try {
|
|
@@ -28922,6 +29017,40 @@ async function listAvailableEnvCandidates(options) {
|
|
|
28922
29017
|
}
|
|
28923
29018
|
}
|
|
28924
29019
|
}
|
|
29020
|
+
/**
|
|
29021
|
+
* Look up an envId across known TCB regions. Used by set_env so a Singapore
|
|
29022
|
+
* env can be bound even when the current session region is ap-shanghai.
|
|
29023
|
+
*/
|
|
29024
|
+
async function resolveEnvCandidateByEnvId(options) {
|
|
29025
|
+
const { envId, cloudBaseOptions, loginState } = options;
|
|
29026
|
+
const seenRegions = new Set();
|
|
29027
|
+
const regionsToProbe = [
|
|
29028
|
+
(0, site_map_js_1.resolveSiteAndRegion)({
|
|
29029
|
+
...(cloudBaseOptions ?? {}),
|
|
29030
|
+
}).region,
|
|
29031
|
+
...site_map_js_1.TCB_QUERY_REGIONS,
|
|
29032
|
+
];
|
|
29033
|
+
for (const region of regionsToProbe) {
|
|
29034
|
+
if (seenRegions.has(region)) {
|
|
29035
|
+
continue;
|
|
29036
|
+
}
|
|
29037
|
+
seenRegions.add(region);
|
|
29038
|
+
const candidates = await listAvailableEnvCandidates({
|
|
29039
|
+
cloudBaseOptions,
|
|
29040
|
+
loginState,
|
|
29041
|
+
region,
|
|
29042
|
+
ignorePinnedEnvId: true,
|
|
29043
|
+
});
|
|
29044
|
+
const matched = candidates.find((item) => item.envId === envId);
|
|
29045
|
+
if (matched) {
|
|
29046
|
+
return {
|
|
29047
|
+
...matched,
|
|
29048
|
+
region: matched.region || region,
|
|
29049
|
+
};
|
|
29050
|
+
}
|
|
29051
|
+
}
|
|
29052
|
+
return undefined;
|
|
29053
|
+
}
|
|
28925
29054
|
function throwAuthRequiredError() {
|
|
28926
29055
|
(0, tool_result_js_1.throwToolPayloadError)({
|
|
28927
29056
|
ok: false,
|
|
@@ -132700,6 +132829,7 @@ module.exports = setup;
|
|
|
132700
132829
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
132701
132830
|
exports.CAM_AUTH_ERROR_PATTERN = void 0;
|
|
132702
132831
|
exports.assertTcbCloudRunActionAllowed = assertTcbCloudRunActionAllowed;
|
|
132832
|
+
exports.resolveCloudApiRegionAndParams = resolveCloudApiRegionAndParams;
|
|
132703
132833
|
exports.removeEmptyStringParams = removeEmptyStringParams;
|
|
132704
132834
|
exports.buildCamAuthGuidance = buildCamAuthGuidance;
|
|
132705
132835
|
exports.isCamAuthError = isCamAuthError;
|
|
@@ -132749,6 +132879,20 @@ function assertTcbCloudRunActionAllowed(service, action) {
|
|
|
132749
132879
|
throw new Error(`[${service}/${action}] 已禁用:${TCB_CLOUDRUN_FORBIDDEN_HINT}`);
|
|
132750
132880
|
}
|
|
132751
132881
|
}
|
|
132882
|
+
function resolveCloudApiRegionAndParams(args) {
|
|
132883
|
+
const raw = { ...(args.params ?? {}) };
|
|
132884
|
+
const nestedRegion = typeof raw.Region === "string" && raw.Region.trim()
|
|
132885
|
+
? raw.Region.trim()
|
|
132886
|
+
: typeof raw.region === "string" && raw.region.trim()
|
|
132887
|
+
? raw.region.trim()
|
|
132888
|
+
: undefined;
|
|
132889
|
+
delete raw.Region;
|
|
132890
|
+
delete raw.region;
|
|
132891
|
+
const region = (typeof args.region === "string" && args.region.trim()
|
|
132892
|
+
? args.region.trim()
|
|
132893
|
+
: undefined) || nestedRegion;
|
|
132894
|
+
return { region, params: raw };
|
|
132895
|
+
}
|
|
132752
132896
|
function levenshteinDistance(left, right) {
|
|
132753
132897
|
const rows = left.length + 1;
|
|
132754
132898
|
const cols = right.length + 1;
|
|
@@ -132865,6 +133009,9 @@ function buildCapiErrorMessage(service, action, error) {
|
|
|
132865
133009
|
}
|
|
132866
133010
|
suggestions.push(buildCapiDocGuidance(service));
|
|
132867
133011
|
}
|
|
133012
|
+
if (/parameter\s+`?Region`?\s+is not recognized/i.test(baseMessage)) {
|
|
133013
|
+
suggestions.push("Region 不是 Action body 参数。请使用 callCloudApi 顶层参数 region(例如 region=\"ap-singapore\"),对应 X-TC-Region。");
|
|
133014
|
+
}
|
|
132868
133015
|
if (hasParameterError) {
|
|
132869
133016
|
suggestions.push("请求参数名与 API 定义不一致,请核对参数字段(区分大小写)并移除未支持字段。");
|
|
132870
133017
|
if (service === "tcb" && tcbEntry) {
|
|
@@ -132922,7 +133069,6 @@ function buildCapiErrorMessage(service, action, error) {
|
|
|
132922
133069
|
function registerCapiTools(server) {
|
|
132923
133070
|
const cloudBaseOptions = server.cloudBaseOptions;
|
|
132924
133071
|
const logger = server.logger;
|
|
132925
|
-
const getManager = () => (0, cloudbase_manager_js_1.getCloudBaseManager)({ cloudBaseOptions });
|
|
132926
133072
|
server.registerTool?.("callCloudApi", {
|
|
132927
133073
|
title: "调用云API",
|
|
132928
133074
|
description: `通用的云 API 调用工具,主要用于 CloudBase / 腾讯云管控面与依赖资源相关 API 调用。调用前请先确认 service、Action 与 Param,避免猜测 Action 名称。如果你的目标是通过 HTTP 协议直接集成 auth/functions/cloudrun/storage/mysqldb 等 CloudBase 业务 API,请不要优先使用 callCloudApi,而应优先查看对应 OpenAPI / Swagger。现有 OpenAPI / Swagger 能力不是通用的管控面 Action 集合;管控面 API 请优先参考 CloudBase API 概览 ${CLOUDBASE_CONTROL_PLANE_DOC_URL} 与云开发依赖资源接口指引 ${CLOUDBASE_DEPENDENCY_API_DOC_URL}。对于 tcb service,常用 Action 分类如下:
|
|
@@ -132935,6 +133081,8 @@ function registerCapiTools(server) {
|
|
|
132935
133081
|
|
|
132936
133082
|
⚠️ 云托管(CloudBase Run)统一走 tcbr service(CreateCloudRunEnv / CreateCloudRunServer / DescribeEnvBaseInfo / DescribeCloudRunEnvs,version="2022-02-17"),tcb 旧小租户接口 CreateCloudBaseRunResource 等已被禁用;部署请用 manageCloudRun。查询单个环境基础信息/是否已开通云托管用 DescribeEnvBaseInfo(EnvId 必填),查询环境列表及资源信息用 DescribeCloudRunEnvs(EnvId 可选过滤)。
|
|
132937
133083
|
|
|
133084
|
+
⚠️ Region 必须作为本工具顶层参数 \`region\` 传入(对应 X-TC-Region / 地域 endpoint),不要放进 params。params 里的 Region 会被剥离并当作顶层 region 使用。
|
|
133085
|
+
|
|
132938
133086
|
销毁环境时,常见做法是至少带上 \`EnvId\` 和 \`BypassCheck: true\`,如果环境已经处于隔离期再按文档补 \`IsForce: true\`。`,
|
|
132939
133087
|
inputSchema: {
|
|
132940
133088
|
service: zod_1.z
|
|
@@ -132951,7 +133099,11 @@ function registerCapiTools(server) {
|
|
|
132951
133099
|
params: zod_1.z
|
|
132952
133100
|
.record(zod_1.z.any())
|
|
132953
133101
|
.optional()
|
|
132954
|
-
.describe("Action 对应的参数对象,键名需与官方 API 定义一致。某些 Action 需要携带 EnvId 等信息;如不确定参数结构,请先查官方文档。tcb 示例:`{ \"service\": \"tcb\", \"action\": \"DestroyEnv\", \"params\": { \"EnvId\": \"env-xxx\", \"BypassCheck\": true } }`,如果环境已经处于隔离期,可再补 `IsForce: true`;更新环境别名则可用 `{ \"service\": \"tcb\", \"action\": \"ModifyEnv\", \"params\": { \"EnvId\": \"env-xxx\", \"Alias\": \"demo\" } }`。若你的场景是通过 HTTP 协议直接集成 auth/functions/cloudrun/storage/mysqldb 等 CloudBase 业务 API,请优先使用 OpenAPI / Swagger 或 searchKnowledgeBase(mode=\"openapi\"),而不是优先使用 callCloudApi。"),
|
|
133102
|
+
.describe("Action 对应的参数对象,键名需与官方 API 定义一致。某些 Action 需要携带 EnvId 等信息;如不确定参数结构,请先查官方文档。tcb 示例:`{ \"service\": \"tcb\", \"action\": \"DestroyEnv\", \"params\": { \"EnvId\": \"env-xxx\", \"BypassCheck\": true } }`,如果环境已经处于隔离期,可再补 `IsForce: true`;更新环境别名则可用 `{ \"service\": \"tcb\", \"action\": \"ModifyEnv\", \"params\": { \"EnvId\": \"env-xxx\", \"Alias\": \"demo\" } }`。不要把 Region 放进 params(会报 The parameter Region is not recognized);跨地域请用顶层 region,例如 `{ \"service\": \"tcb\", \"action\": \"DescribeEnvs\", \"region\": \"ap-singapore\" }`。若你的场景是通过 HTTP 协议直接集成 auth/functions/cloudrun/storage/mysqldb 等 CloudBase 业务 API,请优先使用 OpenAPI / Swagger 或 searchKnowledgeBase(mode=\"openapi\"),而不是优先使用 callCloudApi。"),
|
|
133103
|
+
region: zod_1.z
|
|
133104
|
+
.string()
|
|
133105
|
+
.optional()
|
|
133106
|
+
.describe("云 API 地域(X-TC-Region)。例如 ap-shanghai、ap-guangzhou、ap-singapore。DescribeEnvs 等接口按地域查询,跨地域必须传此顶层参数,不要写入 params.Region。"),
|
|
132955
133107
|
},
|
|
132956
133108
|
annotations: {
|
|
132957
133109
|
readOnlyHint: false,
|
|
@@ -132960,12 +133112,17 @@ function registerCapiTools(server) {
|
|
|
132960
133112
|
openWorldHint: true,
|
|
132961
133113
|
category: CATEGORY,
|
|
132962
133114
|
},
|
|
132963
|
-
}, async ({ service, action, params, version, }) => {
|
|
133115
|
+
}, async ({ service, action, params, version, region, }) => {
|
|
132964
133116
|
if (!ALLOWED_SERVICES.includes(service)) {
|
|
132965
133117
|
throw new Error(`Service ${service} is not allowed. Allowed services: ${ALLOWED_SERVICES.join(", ")}`);
|
|
132966
133118
|
}
|
|
132967
133119
|
assertTcbCloudRunActionAllowed(service, action);
|
|
132968
|
-
const
|
|
133120
|
+
const { region: resolvedRegion, params: bodyParams } = resolveCloudApiRegionAndParams({ region, params });
|
|
133121
|
+
const cloudbase = await (0, cloudbase_manager_js_1.getCloudBaseManager)({
|
|
133122
|
+
cloudBaseOptions: resolvedRegion
|
|
133123
|
+
? { ...cloudBaseOptions, region: resolvedRegion }
|
|
133124
|
+
: cloudBaseOptions,
|
|
133125
|
+
});
|
|
132969
133126
|
if (['1', 'true'].includes(process.env.CLOUDBASE_EVALUATE_MODE ?? '')) {
|
|
132970
133127
|
if (service === 'lowcode') {
|
|
132971
133128
|
throw new Error(`${service}/${action} Cloud API is not exposed or does not exist. Please use another API.`);
|
|
@@ -132996,7 +133153,7 @@ function registerCapiTools(server) {
|
|
|
132996
133153
|
}
|
|
132997
133154
|
let result;
|
|
132998
133155
|
try {
|
|
132999
|
-
const cleanedParams =
|
|
133156
|
+
const cleanedParams = removeEmptyStringParams(bodyParams);
|
|
133000
133157
|
result = await cloudbase.commonService(service, version).call({
|
|
133001
133158
|
Action: action,
|
|
133002
133159
|
Param: cleanedParams,
|
|
@@ -143623,7 +143780,7 @@ class TelemetryReporter {
|
|
|
143623
143780
|
const arch = os_1.default.arch(); // 系统架构
|
|
143624
143781
|
// Build-time injected version; guard for vitest / non-webpack runtimes.
|
|
143625
143782
|
const mcpVersion = process.env.npm_package_version ||
|
|
143626
|
-
( true ? "2.
|
|
143783
|
+
( true ? "2.30.1" : 0);
|
|
143627
143784
|
return {
|
|
143628
143785
|
userAgent: `${osType} ${osRelease} ${arch} ${nodeVersion} CloudBase-MCP/${mcpVersion}`,
|
|
143629
143786
|
deviceId: this.deviceId,
|
|
@@ -219867,7 +220024,7 @@ TransportStream.prototype._nop = function _nop() {
|
|
|
219867
220024
|
"use strict";
|
|
219868
220025
|
|
|
219869
220026
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
219870
|
-
exports.SITE_IDS = exports.SITE_REGION_MAP = void 0;
|
|
220027
|
+
exports.TCB_QUERY_REGIONS = exports.SITE_IDS = exports.SITE_REGION_MAP = void 0;
|
|
219871
220028
|
exports.isSiteId = isSiteId;
|
|
219872
220029
|
exports.normalizeSite = normalizeSite;
|
|
219873
220030
|
exports.getSite = getSite;
|
|
@@ -219895,6 +220052,12 @@ exports.SITE_REGION_MAP = {
|
|
|
219895
220052
|
},
|
|
219896
220053
|
};
|
|
219897
220054
|
exports.SITE_IDS = Object.keys(exports.SITE_REGION_MAP);
|
|
220055
|
+
/** Regions accepted by envQuery(list) / cross-region DescribeEnvs probes. */
|
|
220056
|
+
exports.TCB_QUERY_REGIONS = [
|
|
220057
|
+
"ap-shanghai",
|
|
220058
|
+
"ap-guangzhou",
|
|
220059
|
+
"ap-singapore",
|
|
220060
|
+
];
|
|
219898
220061
|
function isSiteId(value) {
|
|
219899
220062
|
return value === "domestic" || value === "intl";
|
|
219900
220063
|
}
|
|
@@ -225337,7 +225500,7 @@ ${envIdSection}
|
|
|
225337
225500
|
## 环境信息
|
|
225338
225501
|
- 操作系统: ${os_1.default.type()} ${os_1.default.release()}
|
|
225339
225502
|
- Node.js版本: ${process.version}
|
|
225340
|
-
- MCP 版本:${process.env.npm_package_version || ( true ? "2.
|
|
225503
|
+
- MCP 版本:${process.env.npm_package_version || ( true ? "2.30.1" : 0)}
|
|
225341
225504
|
- 系统架构: ${os_1.default.arch()}
|
|
225342
225505
|
- 时间: ${new Date().toISOString()}
|
|
225343
225506
|
- 请求ID: ${requestId}
|
|
@@ -225418,7 +225581,7 @@ function createWrappedHandler(name, handler, server) {
|
|
|
225418
225581
|
requestId: (typeof error === 'object' && error && 'requestId' in error) ? error.requestId : '',
|
|
225419
225582
|
ide: server.ide || process.env.INTEGRATION_IDE || ''
|
|
225420
225583
|
});
|
|
225421
|
-
const mcpVersion = true ? "2.
|
|
225584
|
+
const mcpVersion = true ? "2.30.1" : 0;
|
|
225422
225585
|
const requestIdSuffix = requestId ? `\n🆔 RequestId: ${requestId}` : '';
|
|
225423
225586
|
const enhancedErrorMessage = `${errorMessage}${requestIdSuffix}\n\n📦 CloudBase MCP v${mcpVersion}\n🔗 遇到问题?请复制以下链接到浏览器打开\n即可自动携带错误详情快速创建 GitHub Issue:\n${issueLink}`;
|
|
225424
225587
|
// 创建新的错误对象,保持原有的错误类型但更新消息
|
|
@@ -242861,7 +243024,7 @@ function registerSetupTools(server) {
|
|
|
242861
243024
|
server.registerTool("downloadTemplate", {
|
|
242862
243025
|
title: "下载项目模板",
|
|
242863
243026
|
description: `自动下载并部署CloudBase项目模板。
|
|
242864
|
-
**Note**: Call this tool when the user requests to create a new project using a CloudBase template.\n\n支持的模板:\n- react: React + CloudBase 全栈应用模板\n- vue: Vue + CloudBase 全栈应用模板\n- miniprogram: 微信小程序 + 云开发模板 \n- uniapp: UniApp + CloudBase 跨端应用模板\n- rules: 只包含AI编辑器配置文件(包含Cursor、WindSurf、CodeBuddy等所有主流编辑器配置),适合在已有项目中补充AI编辑器配置\n\n支持的IDE类型:\n- all: 下载所有IDE配置\n- cursor: Cursor AI编辑器\n- 其他IDE类型见下方列表\n\n注意:如果未传入 ide 参数且无法从环境变量检测到 IDE,将提示错误并要求传入 ide 参数\n- windsurf: WindSurf AI编辑器\n- codebuddy: CodeBuddy AI编辑器\n- claude-code: Claude Code AI编辑器\n- cline: Cline AI编辑器\n- gemini-cli: Gemini CLI\n- opencode: OpenCode AI编辑器\n- qwen-code: 通义灵码\n- baidu-comate: 百度Comate\n- openai-codex-cli: OpenAI Codex CLI\n- augment-code: Augment Code\n- github-copilot: GitHub Copilot\n- roocode: RooCode AI编辑器\n- tongyi-lingma: 通义灵码\n- trae: Trae AI编辑器\n- qoder: Qoder AI编辑器\n- antigravity: Google Antigravity AI编辑器\n- vscode: Visual Studio Code\n- kiro: Kiro AI编辑器\n- aider: Aider AI编辑器\n\n特别说明:\n- rules 模板会自动包含当前 mcp 版本号信息(版本号:${ true ? "2.
|
|
243027
|
+
**Note**: Call this tool when the user requests to create a new project using a CloudBase template.\n\n支持的模板:\n- react: React + CloudBase 全栈应用模板\n- vue: Vue + CloudBase 全栈应用模板\n- miniprogram: 微信小程序 + 云开发模板 \n- uniapp: UniApp + CloudBase 跨端应用模板\n- rules: 只包含AI编辑器配置文件(包含Cursor、WindSurf、CodeBuddy等所有主流编辑器配置),适合在已有项目中补充AI编辑器配置\n\n支持的IDE类型:\n- all: 下载所有IDE配置\n- cursor: Cursor AI编辑器\n- 其他IDE类型见下方列表\n\n注意:如果未传入 ide 参数且无法从环境变量检测到 IDE,将提示错误并要求传入 ide 参数\n- windsurf: WindSurf AI编辑器\n- codebuddy: CodeBuddy AI编辑器\n- claude-code: Claude Code AI编辑器\n- cline: Cline AI编辑器\n- gemini-cli: Gemini CLI\n- opencode: OpenCode AI编辑器\n- qwen-code: 通义灵码\n- baidu-comate: 百度Comate\n- openai-codex-cli: OpenAI Codex CLI\n- augment-code: Augment Code\n- github-copilot: GitHub Copilot\n- roocode: RooCode AI编辑器\n- tongyi-lingma: 通义灵码\n- trae: Trae AI编辑器\n- qoder: Qoder AI编辑器\n- antigravity: Google Antigravity AI编辑器\n- vscode: Visual Studio Code\n- kiro: Kiro AI编辑器\n- aider: Aider AI编辑器\n\n特别说明:\n- rules 模板会自动包含当前 mcp 版本号信息(版本号:${ true ? "2.30.1" : 0}),便于后续维护和版本追踪\n- 下载 rules 模板时,如果项目中已存在 README.md 文件,系统会自动保护该文件不被覆盖(除非设置 overwrite=true)`,
|
|
242865
243028
|
inputSchema: {
|
|
242866
243029
|
template: zod_1.z
|
|
242867
243030
|
.enum(["react", "vue", "miniprogram", "uniapp", "rules"])
|