@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/index.js CHANGED
@@ -51,6 +51,7 @@ const zod_1 = __webpack_require__(2971);
51
51
  const auth_js_1 = __webpack_require__(7291);
52
52
  const cloudbase_manager_js_1 = __webpack_require__(3431);
53
53
  const logger_js_1 = __webpack_require__(3039);
54
+ const site_map_js_1 = __webpack_require__(8107);
54
55
  const tool_result_js_1 = __webpack_require__(9835);
55
56
  const gateway_access_urls_js_1 = __webpack_require__(2435);
56
57
  const env_setup_js_1 = __webpack_require__(6978);
@@ -533,6 +534,45 @@ async function fetchAvailableEnvCandidates(cloudBaseOptions, server) {
533
534
  return [];
534
535
  }
535
536
  }
537
+ async function fetchAccountEnvCandidates(cloudBaseOptions) {
538
+ try {
539
+ return await (0, cloudbase_manager_js_1.listAvailableEnvCandidates)({
540
+ cloudBaseOptions,
541
+ ignorePinnedEnvId: true,
542
+ });
543
+ }
544
+ catch {
545
+ return [];
546
+ }
547
+ }
548
+ function isApiKeyCredentialMode() {
549
+ return Boolean((0, auth_js_1.getCloudBaseApiKeyFromEnv)() && process.env.CLOUDBASE_ENV_ID);
550
+ }
551
+ function getCredentialScope() {
552
+ return isApiKeyCredentialMode() ? "single_env" : "account";
553
+ }
554
+ function buildCredentialBoundaryPayload(cloudBaseOptions) {
555
+ const credentialScope = getCredentialScope();
556
+ const currentRegion = (0, site_map_js_1.resolveSiteAndRegion)(cloudBaseOptions ?? {}).region;
557
+ const pinnedEnvId = process.env.CLOUDBASE_ENV_ID || cloudBaseOptions?.envId || null;
558
+ const scopeNote = credentialScope === "single_env"
559
+ ? `当前为环境级 API Key 登录(单环境权限)。只能访问已绑定的 envId${pinnedEnvId ? ` ${pinnedEnvId}` : ""},看不到账号下其他环境或其他地域。这是凭据权限边界,不是环境不存在。`
560
+ : `当前为账号级登录。DescribeEnvs 按地域查询;未传 region 时使用当前地域 ${currentRegion}。其他地域请用 queryEnv(action="list", region="ap-singapore"),或 CLI: tcb env list -r ap-singapore。`;
561
+ return {
562
+ credential_scope: credentialScope,
563
+ current_region: currentRegion,
564
+ scope_note: scopeNote,
565
+ };
566
+ }
567
+ function applyBoundEnvRegion(server, region) {
568
+ if (!region) {
569
+ return;
570
+ }
571
+ process.env.TCB_REGION = region;
572
+ if (server.cloudBaseOptions) {
573
+ server.cloudBaseOptions.region = region;
574
+ }
575
+ }
536
576
  const CODEBUDDY_AUTH_ACTIONS = ["status", "set_env", "login_by_api_key"];
537
577
  const DEFAULT_AUTH_ACTIONS = [
538
578
  "status",
@@ -763,7 +803,10 @@ async function prepareAuthEnvironment(params) {
763
803
  }
764
804
  function buildEnvQueryListResult(params) {
765
805
  const envList = Array.isArray(params.result?.EnvList) ? params.result.EnvList : [];
766
- const shouldRestrictToCurrentEnv = params.hasEnvId && !params.filters.alias && !params.filters.envId;
806
+ const shouldRestrictToCurrentEnv = params.hasEnvId &&
807
+ !params.filters.alias &&
808
+ !params.filters.envId &&
809
+ !params.filters.region;
767
810
  const baseList = shouldRestrictToCurrentEnv
768
811
  ? envList.filter((env) => env.EnvId === params.cloudBaseOptions?.envId)
769
812
  : envList;
@@ -780,6 +823,11 @@ function buildEnvQueryListResult(params) {
780
823
  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.",
781
824
  }
782
825
  : undefined;
826
+ const credentialBoundary = buildCredentialBoundaryPayload(params.cloudBaseOptions);
827
+ const queryRegion = params.filters.region || credentialBoundary.current_region;
828
+ const currentEnvOnlyNote = shouldRestrictToCurrentEnv && credentialBoundary.credential_scope === "account"
829
+ ? `已绑定环境,list 默认只返回当前环境。要查看其他地域请传 region(例如 region="ap-singapore"),或使用 CLI: tcb env list -r ap-singapore。`
830
+ : undefined;
783
831
  return {
784
832
  EnvList: paginated.items.map((env) => selectEnvFields(env, params.filters.fields)),
785
833
  TotalCount: paginated.total,
@@ -790,9 +838,13 @@ function buildEnvQueryListResult(params) {
790
838
  alias: params.filters.alias ?? null,
791
839
  aliasExact: params.filters.aliasExact ?? null,
792
840
  envId: params.filters.envId ?? null,
841
+ region: params.filters.region ?? null,
793
842
  fields: params.filters.fields ?? [...DEFAULT_ENV_FIELDS],
794
843
  currentEnvOnly: shouldRestrictToCurrentEnv,
795
844
  },
845
+ ...credentialBoundary,
846
+ query_region: queryRegion,
847
+ ...(currentEnvOnlyNote ? { scope_note: currentEnvOnlyNote } : {}),
796
848
  ...(exactEnvIdSummaryHint
797
849
  ? {
798
850
  RecommendedNextAction: exactEnvIdSummaryHint,
@@ -1498,13 +1550,14 @@ function registerEnvTools(server) {
1498
1550
  requireEnvId: options?.requireEnvId ?? true,
1499
1551
  mcpServer: server,
1500
1552
  });
1501
- const getManagerForEnvQuery = (targetEnvId, requireEnvId = true) => (0, cloudbase_manager_js_1.getCloudBaseManager)({
1502
- cloudBaseOptions: targetEnvId && targetEnvId !== cloudBaseOptions?.envId
1503
- ? {
1504
- ...cloudBaseOptions,
1505
- envId: targetEnvId,
1506
- }
1507
- : cloudBaseOptions,
1553
+ const getManagerForEnvQuery = (targetEnvId, requireEnvId = true, region) => (0, cloudbase_manager_js_1.getCloudBaseManager)({
1554
+ cloudBaseOptions: {
1555
+ ...cloudBaseOptions,
1556
+ ...(targetEnvId && targetEnvId !== cloudBaseOptions?.envId
1557
+ ? { envId: targetEnvId }
1558
+ : {}),
1559
+ ...(region ? { region } : {}),
1560
+ },
1508
1561
  requireEnvId,
1509
1562
  mcpServer: server,
1510
1563
  });
@@ -1516,7 +1569,7 @@ function registerEnvTools(server) {
1516
1569
  if (server.ide !== 'wxide') {
1517
1570
  server.registerTool?.("auth", {
1518
1571
  title: "CloudBase 开发阶段登录与环境",
1519
- description: "CloudBase(腾讯云开发)开发阶段登录与环境绑定。登录后即可访问云资源;环境(env)是云函数、数据库、静态托管等资源的隔离单元,绑定环境后其他 MCP 工具才能操作该环境。支持:查询状态、发起登录、API Key登录、绑定环境(set_env)、退出登录。",
1572
+ description: "CloudBase(腾讯云开发)开发阶段登录与环境绑定。登录后即可访问云资源;环境(env)是云函数、数据库、静态托管等资源的隔离单元,绑定环境后其他 MCP 工具才能操作该环境。支持:查询状态、发起登录、API Key登录、绑定环境(set_env)、退出登录。auth(status) 会返回 credential_scope(account=账号级 / single_env=环境级 API Key)与当前 region;环境级 API Key 只能看到绑定的 envId,查不到其他地域环境是权限边界而非环境不存在。",
1520
1573
  inputSchema: {
1521
1574
  action: zod_1.z
1522
1575
  .enum(authActionEnum)
@@ -1630,13 +1683,7 @@ function registerEnvTools(server) {
1630
1683
  ? "PENDING"
1631
1684
  : "REQUIRED";
1632
1685
  let envPreparation;
1633
- const message = authStatus === "READY"
1634
- ? undefined
1635
- : authStatus === "PENDING"
1636
- ? "设备码授权进行中,请完成浏览器授权后再次调用 auth(action=\"status\")"
1637
- : isCodeBuddyIde(server)
1638
- ? "当前未登录。CodeBuddy 暂不支持在 tool 内发起认证,请在外部完成认证后再次调用 auth(action=\"status\")。"
1639
- : "当前未登录,请先执行 auth(action=\"start_auth\")";
1686
+ const credentialBoundary = buildCredentialBoundaryPayload(cloudBaseOptions);
1640
1687
  if (authStatus === "READY" && loginState) {
1641
1688
  envPreparation = await prepareAuthEnvironment({
1642
1689
  server,
@@ -1644,11 +1691,21 @@ function registerEnvTools(server) {
1644
1691
  loginState,
1645
1692
  });
1646
1693
  }
1694
+ const statusMessage = authStatus === "READY"
1695
+ ? envPreparation?.message
1696
+ ? `${envPreparation.message} ${credentialBoundary.scope_note}`
1697
+ : credentialBoundary.scope_note
1698
+ : authStatus === "PENDING"
1699
+ ? "设备码授权进行中,请完成浏览器授权后再次调用 auth(action=\"status\")"
1700
+ : isCodeBuddyIde(server)
1701
+ ? "当前未登录。CodeBuddy 暂不支持在 tool 内发起认证,请在外部完成认证后再次调用 auth(action=\"status\")。"
1702
+ : "当前未登录,请先执行 auth(action=\"start_auth\")";
1647
1703
  return (0, tool_result_js_1.buildJsonToolResult)({
1648
1704
  ok: true,
1649
1705
  code: "STATUS",
1650
1706
  auth_status: authStatus,
1651
1707
  ...(isApiKeyMode ? { auth_mode: "api_key" } : {}),
1708
+ ...credentialBoundary,
1652
1709
  auth_config: authConfigSummary,
1653
1710
  ...(envPreparation
1654
1711
  ? buildAuthEnvSetupPayload(envPreparation)
@@ -1660,7 +1717,7 @@ function registerEnvTools(server) {
1660
1717
  auth_challenge: authFlowState.status === "PENDING"
1661
1718
  ? (0, auth_js_1.buildDeviceAuthChallengePayload)(authFlowState.authChallenge)
1662
1719
  : undefined,
1663
- message,
1720
+ message: statusMessage,
1664
1721
  next_step: authStatus === "REQUIRED"
1665
1722
  ? buildAuthRequiredNextStep(server)
1666
1723
  : authStatus === "PENDING"
@@ -1958,32 +2015,63 @@ function registerEnvTools(server) {
1958
2015
  next_step: buildAuthRequiredNextStep(server),
1959
2016
  });
1960
2017
  }
1961
- const envCandidates = await fetchAvailableEnvCandidates(cloudBaseOptions, server);
2018
+ const credentialBoundary = buildCredentialBoundaryPayload(cloudBaseOptions);
2019
+ const envCandidates = isApiKeyCredentialMode()
2020
+ ? await fetchAvailableEnvCandidates(cloudBaseOptions, server)
2021
+ : await fetchAccountEnvCandidates(cloudBaseOptions);
1962
2022
  if (!envId) {
1963
2023
  return (0, tool_result_js_1.buildJsonToolResult)({
1964
2024
  ok: false,
1965
2025
  code: "INVALID_ARGS",
1966
2026
  message: "action=set_env 时必须提供 envId",
2027
+ ...credentialBoundary,
1967
2028
  ...buildEnvCandidatePayload(envCandidates),
1968
2029
  next_step: buildSetEnvNextStep(envCandidates),
1969
2030
  });
1970
2031
  }
1971
- const target = envCandidates.find((item) => item.envId === envId);
1972
- if (envCandidates.length > 0 && !target) {
2032
+ if (isApiKeyCredentialMode()) {
2033
+ const pinnedEnvId = process.env.CLOUDBASE_ENV_ID;
2034
+ if (pinnedEnvId && envId !== pinnedEnvId) {
2035
+ return (0, tool_result_js_1.buildJsonToolResult)({
2036
+ ok: false,
2037
+ code: "CREDENTIAL_SCOPE_LIMITED",
2038
+ message: `当前为环境级 API Key 登录,只能绑定已授权环境 ${pinnedEnvId},不能切换到 ${envId}。这是凭据权限边界,不是目标环境不存在。`,
2039
+ ...credentialBoundary,
2040
+ current_env_id: pinnedEnvId,
2041
+ ...buildEnvCandidatePayload(envCandidates),
2042
+ });
2043
+ }
2044
+ await cloudbase_manager_js_1.envManager.setEnvId(envId);
1973
2045
  return (0, tool_result_js_1.buildJsonToolResult)({
1974
- ok: false,
1975
- code: "INVALID_ARGS",
1976
- message: `未找到环境: ${envId}`,
1977
- ...buildEnvCandidatePayload(envCandidates),
1978
- next_step: buildSetEnvNextStep(envCandidates),
2046
+ ok: true,
2047
+ code: "ENV_READY",
2048
+ message: `环境设置成功,当前环境: ${envId}`,
2049
+ current_env_id: envId,
2050
+ ...credentialBoundary,
2051
+ });
2052
+ }
2053
+ let target = envCandidates.find((item) => item.envId === envId);
2054
+ if (!target) {
2055
+ target = await (0, cloudbase_manager_js_1.resolveEnvCandidateByEnvId)({
2056
+ envId,
2057
+ cloudBaseOptions,
2058
+ loginState,
1979
2059
  });
1980
2060
  }
1981
2061
  await cloudbase_manager_js_1.envManager.setEnvId(envId);
2062
+ applyBoundEnvRegion(server, target?.region);
2063
+ const regionHint = target?.region
2064
+ ? `,地域: ${target.region}`
2065
+ : target
2066
+ ? ""
2067
+ : "。未在当前探测地域中确认该 envId,已按唯一 ID 直绑;若后续接口仍指向错误地域,请设置 TCB_REGION 或 queryEnv(action=\"list\", region=...)";
1982
2068
  return (0, tool_result_js_1.buildJsonToolResult)({
1983
2069
  ok: true,
1984
2070
  code: "ENV_READY",
1985
- message: `环境设置成功,当前环境: ${envId}`,
2071
+ message: `环境设置成功,当前环境: ${envId}${regionHint}`,
2072
+ ...credentialBoundary,
1986
2073
  current_env_id: envId,
2074
+ current_region: target?.region || credentialBoundary.current_region,
1987
2075
  });
1988
2076
  }
1989
2077
  if (action === "logout") {
@@ -2090,23 +2178,20 @@ function registerEnvTools(server) {
2090
2178
  });
2091
2179
  } // end: wxide guard for auth tool
2092
2180
  // queryEnv - 环境查询(合并 listEnvs + getEnvInfo + getEnvAuthDomains + usage + metrics)
2093
- const queryEnvHandler = async ({ action, alias, aliasExact, envId, limit, offset, fields, type, startDate, endDate, needUsageDetails, metricName, startTime, endTime, period, resourceID, subresourceID, }) => {
2181
+ const queryEnvHandler = async ({ action, alias, aliasExact, envId, region, limit, offset, fields, type, startDate, endDate, needUsageDetails, metricName, startTime, endTime, period, resourceID, subresourceID, }) => {
2094
2182
  try {
2095
2183
  let result;
2096
2184
  switch (action) {
2097
2185
  case "list":
2098
2186
  try {
2099
- const cloudbaseList = await (0, cloudbase_manager_js_1.getCloudBaseManager)({
2100
- cloudBaseOptions,
2101
- requireEnvId: true,
2102
- mcpServer: server, // Pass server for IDE detection
2103
- });
2104
- // 当环境变量设置了 CLOUDBASE_ENV_ID 时(如 API Key 模式),
2105
- // 避免调用 DescribeEnvs(临时密钥可能不支持该接口),
2106
- // 改为通过 DescribeEnvInfo 获取单环境信息
2107
- // 注意:requestFn 模式(如微信 IDE)使用 DescribeEnvs,不走此分支
2187
+ const cloudbaseList = await getManagerForEnvQuery(undefined, false, region);
2188
+ // API Key / env-var pin: skip DescribeEnvs (STS often cannot list).
2189
+ // Account-level sessions that only pinned CLOUDBASE_ENV_ID via set_env
2190
+ // can still pass region/alias/envId to list other environments.
2108
2191
  const envIdFromEnv = !cloudBaseOptions?.requestFn && process.env.CLOUDBASE_ENV_ID;
2109
- if (envIdFromEnv) {
2192
+ const shouldPinToEnvVar = Boolean(envIdFromEnv &&
2193
+ (isApiKeyCredentialMode() || (!region && !alias && !envId)));
2194
+ if (shouldPinToEnvVar && envIdFromEnv) {
2110
2195
  try {
2111
2196
  const envInfo = await cloudbaseList.env.describeEnvInfo({ EnvId: envIdFromEnv });
2112
2197
  (0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, envInfo);
@@ -2160,11 +2245,7 @@ function registerEnvTools(server) {
2160
2245
  (0, logger_js_1.debug)("获取环境列表时出错,尝试降级到 listEnvs():", error instanceof Error ? error : new Error(String(error)));
2161
2246
  // Fallback to original method on error
2162
2247
  try {
2163
- const cloudbaseList = await (0, cloudbase_manager_js_1.getCloudBaseManager)({
2164
- cloudBaseOptions,
2165
- requireEnvId: true,
2166
- mcpServer: server, // Pass server for IDE detection
2167
- });
2248
+ const cloudbaseList = await getManagerForEnvQuery(undefined, false, region);
2168
2249
  result = await cloudbaseList.env.listEnvs();
2169
2250
  (0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, result);
2170
2251
  }
@@ -2193,6 +2274,7 @@ function registerEnvTools(server) {
2193
2274
  alias,
2194
2275
  aliasExact,
2195
2276
  envId,
2277
+ region,
2196
2278
  limit,
2197
2279
  offset,
2198
2280
  fields,
@@ -2372,17 +2454,21 @@ function registerEnvTools(server) {
2372
2454
  // Register primary tool name (queryEnv)
2373
2455
  const queryEnvToolSchema = {
2374
2456
  title: "CloudBase 环境查询",
2375
- description: "查询 CloudBase 环境相关信息,支持查询环境列表、指定环境详情、安全域名、资源用量与监控指标。(曾用名:envQuery、listEnvs、getEnvInfo、getEnvAuthDomains)当 action=list 时,会按 DescribeEnvs 语义做列表/筛选,标准返回字段为 EnvId、Alias、Status、EnvType、Region、PackageId、PackageName、IsDefault,并支持通过 fields 白名单裁剪这些字段;aliasExact=true 时会按别名精确筛选,避免把前缀相近的环境误当作候选;即使传入 envId,action=list 也只返回摘要,不会返回完整资源明细或 expiry。如需查询某个已知 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 都不该使用。",
2457
+ 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 都不该使用。",
2376
2458
  inputSchema: {
2377
2459
  action: zod_1.z
2378
2460
  .enum(["list", "info", "domains", "usage", "metrics"])
2379
- .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)"),
2461
+ .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)"),
2380
2462
  alias: zod_1.z.string().optional().describe("按环境别名筛选。action=list 时可选"),
2381
2463
  aliasExact: zod_1.z.boolean().optional().describe("按环境别名精确筛选。action=list 时可选;与 alias 配合使用"),
2382
2464
  envId: zod_1.z
2383
2465
  .string()
2384
2466
  .optional()
2385
2467
  .describe("环境 ID。action=list 时可选(仅按 DescribeEnvs 语义做筛选,仍返回摘要);action=info / action=usage / action=metrics 时必填。"),
2468
+ region: zod_1.z
2469
+ .enum(site_map_js_1.TCB_QUERY_REGIONS)
2470
+ .optional()
2471
+ .describe("查询地域。仅 action=list 时有效。账号级凭据会把该值透传到 DescribeEnvs(X-TC-Region),例如 ap-singapore。环境级 API Key 无法用此参数看到其他环境。等价 CLI:tcb env list -r <region> --json。"),
2386
2472
  limit: zod_1.z.number().int().positive().optional().describe("返回数量上限。action=list 时可选"),
2387
2473
  offset: zod_1.z.number().int().min(0).optional().describe("分页偏移。action=list 时可选"),
2388
2474
  fields: zod_1.z
@@ -2946,6 +3032,7 @@ function registerEnvTools(server) {
2946
3032
  Object.defineProperty(exports, "__esModule", ({ value: true }));
2947
3033
  exports.CAM_AUTH_ERROR_PATTERN = void 0;
2948
3034
  exports.assertTcbCloudRunActionAllowed = assertTcbCloudRunActionAllowed;
3035
+ exports.resolveCloudApiRegionAndParams = resolveCloudApiRegionAndParams;
2949
3036
  exports.removeEmptyStringParams = removeEmptyStringParams;
2950
3037
  exports.buildCamAuthGuidance = buildCamAuthGuidance;
2951
3038
  exports.isCamAuthError = isCamAuthError;
@@ -2995,6 +3082,20 @@ function assertTcbCloudRunActionAllowed(service, action) {
2995
3082
  throw new Error(`[${service}/${action}] 已禁用:${TCB_CLOUDRUN_FORBIDDEN_HINT}`);
2996
3083
  }
2997
3084
  }
3085
+ function resolveCloudApiRegionAndParams(args) {
3086
+ const raw = { ...(args.params ?? {}) };
3087
+ const nestedRegion = typeof raw.Region === "string" && raw.Region.trim()
3088
+ ? raw.Region.trim()
3089
+ : typeof raw.region === "string" && raw.region.trim()
3090
+ ? raw.region.trim()
3091
+ : undefined;
3092
+ delete raw.Region;
3093
+ delete raw.region;
3094
+ const region = (typeof args.region === "string" && args.region.trim()
3095
+ ? args.region.trim()
3096
+ : undefined) || nestedRegion;
3097
+ return { region, params: raw };
3098
+ }
2998
3099
  function levenshteinDistance(left, right) {
2999
3100
  const rows = left.length + 1;
3000
3101
  const cols = right.length + 1;
@@ -3111,6 +3212,9 @@ function buildCapiErrorMessage(service, action, error) {
3111
3212
  }
3112
3213
  suggestions.push(buildCapiDocGuidance(service));
3113
3214
  }
3215
+ if (/parameter\s+`?Region`?\s+is not recognized/i.test(baseMessage)) {
3216
+ suggestions.push("Region 不是 Action body 参数。请使用 callCloudApi 顶层参数 region(例如 region=\"ap-singapore\"),对应 X-TC-Region。");
3217
+ }
3114
3218
  if (hasParameterError) {
3115
3219
  suggestions.push("请求参数名与 API 定义不一致,请核对参数字段(区分大小写)并移除未支持字段。");
3116
3220
  if (service === "tcb" && tcbEntry) {
@@ -3168,7 +3272,6 @@ function buildCapiErrorMessage(service, action, error) {
3168
3272
  function registerCapiTools(server) {
3169
3273
  const cloudBaseOptions = server.cloudBaseOptions;
3170
3274
  const logger = server.logger;
3171
- const getManager = () => (0, cloudbase_manager_js_1.getCloudBaseManager)({ cloudBaseOptions });
3172
3275
  server.registerTool?.("callCloudApi", {
3173
3276
  title: "调用云API",
3174
3277
  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 分类如下:
@@ -3181,6 +3284,8 @@ function registerCapiTools(server) {
3181
3284
 
3182
3285
  ⚠️ 云托管(CloudBase Run)统一走 tcbr service(CreateCloudRunEnv / CreateCloudRunServer / DescribeEnvBaseInfo / DescribeCloudRunEnvs,version="2022-02-17"),tcb 旧小租户接口 CreateCloudBaseRunResource 等已被禁用;部署请用 manageCloudRun。查询单个环境基础信息/是否已开通云托管用 DescribeEnvBaseInfo(EnvId 必填),查询环境列表及资源信息用 DescribeCloudRunEnvs(EnvId 可选过滤)。
3183
3286
 
3287
+ ⚠️ Region 必须作为本工具顶层参数 \`region\` 传入(对应 X-TC-Region / 地域 endpoint),不要放进 params。params 里的 Region 会被剥离并当作顶层 region 使用。
3288
+
3184
3289
  销毁环境时,常见做法是至少带上 \`EnvId\` 和 \`BypassCheck: true\`,如果环境已经处于隔离期再按文档补 \`IsForce: true\`。`,
3185
3290
  inputSchema: {
3186
3291
  service: zod_1.z
@@ -3197,7 +3302,11 @@ function registerCapiTools(server) {
3197
3302
  params: zod_1.z
3198
3303
  .record(zod_1.z.any())
3199
3304
  .optional()
3200
- .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。"),
3305
+ .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。"),
3306
+ region: zod_1.z
3307
+ .string()
3308
+ .optional()
3309
+ .describe("云 API 地域(X-TC-Region)。例如 ap-shanghai、ap-guangzhou、ap-singapore。DescribeEnvs 等接口按地域查询,跨地域必须传此顶层参数,不要写入 params.Region。"),
3201
3310
  },
3202
3311
  annotations: {
3203
3312
  readOnlyHint: false,
@@ -3206,12 +3315,17 @@ function registerCapiTools(server) {
3206
3315
  openWorldHint: true,
3207
3316
  category: CATEGORY,
3208
3317
  },
3209
- }, async ({ service, action, params, version, }) => {
3318
+ }, async ({ service, action, params, version, region, }) => {
3210
3319
  if (!ALLOWED_SERVICES.includes(service)) {
3211
3320
  throw new Error(`Service ${service} is not allowed. Allowed services: ${ALLOWED_SERVICES.join(", ")}`);
3212
3321
  }
3213
3322
  assertTcbCloudRunActionAllowed(service, action);
3214
- const cloudbase = await getManager();
3323
+ const { region: resolvedRegion, params: bodyParams } = resolveCloudApiRegionAndParams({ region, params });
3324
+ const cloudbase = await (0, cloudbase_manager_js_1.getCloudBaseManager)({
3325
+ cloudBaseOptions: resolvedRegion
3326
+ ? { ...cloudBaseOptions, region: resolvedRegion }
3327
+ : cloudBaseOptions,
3328
+ });
3215
3329
  if (['1', 'true'].includes(process.env.CLOUDBASE_EVALUATE_MODE ?? '')) {
3216
3330
  if (service === 'lowcode') {
3217
3331
  throw new Error(`${service}/${action} Cloud API is not exposed or does not exist. Please use another API.`);
@@ -3242,7 +3356,7 @@ function registerCapiTools(server) {
3242
3356
  }
3243
3357
  let result;
3244
3358
  try {
3245
- const cleanedParams = params ? removeEmptyStringParams(params) : {};
3359
+ const cleanedParams = removeEmptyStringParams(bodyParams);
3246
3360
  result = await cloudbase.commonService(service, version).call({
3247
3361
  Action: action,
3248
3362
  Param: cleanedParams,
@@ -3360,7 +3474,7 @@ ${envIdSection}
3360
3474
  ## 环境信息
3361
3475
  - 操作系统: ${os_1.default.type()} ${os_1.default.release()}
3362
3476
  - Node.js版本: ${process.version}
3363
- - MCP 版本:${process.env.npm_package_version || ( true ? "2.29.0" : 0)}
3477
+ - MCP 版本:${process.env.npm_package_version || ( true ? "2.30.1" : 0)}
3364
3478
  - 系统架构: ${os_1.default.arch()}
3365
3479
  - 时间: ${new Date().toISOString()}
3366
3480
  - 请求ID: ${requestId}
@@ -3441,7 +3555,7 @@ function createWrappedHandler(name, handler, server) {
3441
3555
  requestId: (typeof error === 'object' && error && 'requestId' in error) ? error.requestId : '',
3442
3556
  ide: server.ide || process.env.INTEGRATION_IDE || ''
3443
3557
  });
3444
- const mcpVersion = true ? "2.29.0" : 0;
3558
+ const mcpVersion = true ? "2.30.1" : 0;
3445
3559
  const requestIdSuffix = requestId ? `\n🆔 RequestId: ${requestId}` : '';
3446
3560
  const enhancedErrorMessage = `${errorMessage}${requestIdSuffix}\n\n📦 CloudBase MCP v${mcpVersion}\n🔗 遇到问题?请复制以下链接到浏览器打开\n即可自动携带错误详情快速创建 GitHub Issue:\n${issueLink}`;
3447
3561
  // 创建新的错误对象,保持原有的错误类型但更新消息
@@ -5300,6 +5414,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5300
5414
  Object.defineProperty(exports, "__esModule", ({ value: true }));
5301
5415
  exports.envManager = void 0;
5302
5416
  exports.listAvailableEnvCandidates = listAvailableEnvCandidates;
5417
+ exports.resolveEnvCandidateByEnvId = resolveEnvCandidateByEnvId;
5303
5418
  exports.getEnvId = getEnvId;
5304
5419
  exports.resetCloudBaseManagerCache = resetCloudBaseManagerCache;
5305
5420
  exports.getCachedEnvId = getCachedEnvId;
@@ -5343,31 +5458,39 @@ function createManagerFromLoginState(loginState, region) {
5343
5458
  });
5344
5459
  }
5345
5460
  async function listAvailableEnvCandidates(options) {
5346
- const { cloudBaseOptions, loginState: providedLoginState } = options ?? {};
5347
- // 优先使用显式传入的 envId
5348
- if (cloudBaseOptions?.envId) {
5349
- return [{
5350
- envId: cloudBaseOptions.envId,
5351
- }];
5352
- }
5353
- // 当环境变量设置了 CLOUDBASE_ENV_ID 且没有显式 credentials 时,直接返回(避免调 DescribeEnvs)
5354
- // 有显式 credentials 时需要重新查询,因为可能是不同账号
5355
- const hasExplicitCredentials = !!(cloudBaseOptions?.secretId && cloudBaseOptions?.secretKey);
5356
- if (process.env.CLOUDBASE_ENV_ID && !hasExplicitCredentials) {
5357
- return [{
5358
- envId: process.env.CLOUDBASE_ENV_ID,
5359
- }];
5461
+ const { cloudBaseOptions, loginState: providedLoginState, region: regionOverride, ignorePinnedEnvId, } = options ?? {};
5462
+ if (!ignorePinnedEnvId) {
5463
+ // Prefer an explicit envId pin (bound session / API Key).
5464
+ if (cloudBaseOptions?.envId) {
5465
+ return [{
5466
+ envId: cloudBaseOptions.envId,
5467
+ region: cloudBaseOptions.region,
5468
+ }];
5469
+ }
5470
+ // When CLOUDBASE_ENV_ID is set and credentials are not explicit, skip DescribeEnvs.
5471
+ const hasExplicitCredentials = !!(cloudBaseOptions?.secretId && cloudBaseOptions?.secretKey);
5472
+ if (process.env.CLOUDBASE_ENV_ID && !hasExplicitCredentials) {
5473
+ return [{
5474
+ envId: process.env.CLOUDBASE_ENV_ID,
5475
+ }];
5476
+ }
5360
5477
  }
5478
+ const region = (0, site_map_js_1.resolveSiteAndRegion)({
5479
+ ...(cloudBaseOptions ?? {}),
5480
+ ...(regionOverride ? { region: regionOverride } : {}),
5481
+ }).region;
5361
5482
  let cloudbase;
5362
5483
  if (cloudBaseOptions?.secretId && cloudBaseOptions?.secretKey) {
5363
- cloudbase = createCloudBaseManagerWithOptions(cloudBaseOptions);
5484
+ cloudbase = createCloudBaseManagerWithOptions({
5485
+ ...cloudBaseOptions,
5486
+ region,
5487
+ });
5364
5488
  }
5365
5489
  else {
5366
5490
  const loginState = providedLoginState ?? await (0, auth_js_1.peekLoginState)();
5367
5491
  if (!loginState?.secretId || !loginState?.secretKey) {
5368
5492
  return [];
5369
5493
  }
5370
- const region = (0, site_map_js_1.resolveSiteAndRegion)(cloudBaseOptions ?? {}).region;
5371
5494
  cloudbase = createManagerFromLoginState(loginState, region);
5372
5495
  }
5373
5496
  try {
@@ -5392,6 +5515,40 @@ async function listAvailableEnvCandidates(options) {
5392
5515
  }
5393
5516
  }
5394
5517
  }
5518
+ /**
5519
+ * Look up an envId across known TCB regions. Used by set_env so a Singapore
5520
+ * env can be bound even when the current session region is ap-shanghai.
5521
+ */
5522
+ async function resolveEnvCandidateByEnvId(options) {
5523
+ const { envId, cloudBaseOptions, loginState } = options;
5524
+ const seenRegions = new Set();
5525
+ const regionsToProbe = [
5526
+ (0, site_map_js_1.resolveSiteAndRegion)({
5527
+ ...(cloudBaseOptions ?? {}),
5528
+ }).region,
5529
+ ...site_map_js_1.TCB_QUERY_REGIONS,
5530
+ ];
5531
+ for (const region of regionsToProbe) {
5532
+ if (seenRegions.has(region)) {
5533
+ continue;
5534
+ }
5535
+ seenRegions.add(region);
5536
+ const candidates = await listAvailableEnvCandidates({
5537
+ cloudBaseOptions,
5538
+ loginState,
5539
+ region,
5540
+ ignorePinnedEnvId: true,
5541
+ });
5542
+ const matched = candidates.find((item) => item.envId === envId);
5543
+ if (matched) {
5544
+ return {
5545
+ ...matched,
5546
+ region: matched.region || region,
5547
+ };
5548
+ }
5549
+ }
5550
+ return undefined;
5551
+ }
5395
5552
  function throwAuthRequiredError() {
5396
5553
  (0, tool_result_js_1.throwToolPayloadError)({
5397
5554
  ok: false,
@@ -13283,7 +13440,7 @@ class TelemetryReporter {
13283
13440
  const arch = os_1.default.arch(); // 系统架构
13284
13441
  // Build-time injected version; guard for vitest / non-webpack runtimes.
13285
13442
  const mcpVersion = process.env.npm_package_version ||
13286
- ( true ? "2.29.0" : 0);
13443
+ ( true ? "2.30.1" : 0);
13287
13444
  return {
13288
13445
  userAgent: `${osType} ${osRelease} ${arch} ${nodeVersion} CloudBase-MCP/${mcpVersion}`,
13289
13446
  deviceId: this.deviceId,
@@ -19190,7 +19347,7 @@ function registerSetupTools(server) {
19190
19347
  server.registerTool("downloadTemplate", {
19191
19348
  title: "下载项目模板",
19192
19349
  description: `自动下载并部署CloudBase项目模板。
19193
- **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.29.0" : 0}),便于后续维护和版本追踪\n- 下载 rules 模板时,如果项目中已存在 README.md 文件,系统会自动保护该文件不被覆盖(除非设置 overwrite=true)`,
19350
+ **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)`,
19194
19351
  inputSchema: {
19195
19352
  template: zod_1.z
19196
19353
  .enum(["react", "vue", "miniprogram", "uniapp", "rules"])
@@ -21827,7 +21984,7 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_fs_promises_f8dae9d1__;
21827
21984
 
21828
21985
 
21829
21986
  Object.defineProperty(exports, "__esModule", ({ value: true }));
21830
- exports.SITE_IDS = exports.SITE_REGION_MAP = void 0;
21987
+ exports.TCB_QUERY_REGIONS = exports.SITE_IDS = exports.SITE_REGION_MAP = void 0;
21831
21988
  exports.isSiteId = isSiteId;
21832
21989
  exports.normalizeSite = normalizeSite;
21833
21990
  exports.getSite = getSite;
@@ -21855,6 +22012,12 @@ exports.SITE_REGION_MAP = {
21855
22012
  },
21856
22013
  };
21857
22014
  exports.SITE_IDS = Object.keys(exports.SITE_REGION_MAP);
22015
+ /** Regions accepted by envQuery(list) / cross-region DescribeEnvs probes. */
22016
+ exports.TCB_QUERY_REGIONS = [
22017
+ "ap-shanghai",
22018
+ "ap-guangzhou",
22019
+ "ap-singapore",
22020
+ ];
21858
22021
  function isSiteId(value) {
21859
22022
  return value === "domestic" || value === "intl";
21860
22023
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudbase/cloudbase-mcp",
3
- "version": "2.29.0",
3
+ "version": "2.30.1",
4
4
  "mcpName": "io.github.TencentCloudBase/cloudbase-mcp",
5
5
  "packageManager": "pnpm@10.8.0",
6
6
  "description": "CloudBase MCP Server — operate Tencent CloudBase (database, auth, functions, storage, hosting) from AI coding tools via the Model Context Protocol. Part of CloudBase AI Toolkit.",
package/server.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.TencentCloudBase/cloudbase-mcp",
4
4
  "title": "CloudBase",
5
5
  "description": "CloudBase MCP: DB, functions, storage, hosting via @cloudbase/cloudbase-mcp",
6
- "version": "2.29.0",
6
+ "version": "2.30.1",
7
7
  "websiteUrl": "https://github.com/TencentCloudBase/CloudBase-AI-Toolkit",
8
8
  "repository": {
9
9
  "url": "https://github.com/TencentCloudBase/CloudBase-AI-Toolkit",
@@ -25,7 +25,7 @@
25
25
  "registryType": "npm",
26
26
  "registryBaseUrl": "https://registry.npmjs.org",
27
27
  "identifier": "@cloudbase/cloudbase-mcp",
28
- "version": "2.29.0",
28
+ "version": "2.30.1",
29
29
  "runtimeHint": "npx",
30
30
  "transport": {
31
31
  "type": "stdio"