Skip to content

Commit 92cebe8

Browse files
authored
Merge pull request #555 from TencentCloudBase/automation/attribution-issue-mns2ckez-z9rdxw-managegateway-http
fix: manageGateway 工具参数设计不清晰导致 HTTP 函数配置不完整
2 parents 351a663 + db9cdac commit 92cebe8

2 files changed

Lines changed: 55 additions & 8 deletions

File tree

mcp/src/tools/gateway.test.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,18 @@ describe("gateway tools", () => {
141141
({ tools } = createMockServer());
142142
});
143143

144+
it("manageGateway schema should explain how to expose an existing HTTP function", () => {
145+
const schema = tools.manageGateway.meta.inputSchema;
146+
147+
expect(tools.manageGateway.meta.description).toContain("HTTP 云函数补默认域名访问");
148+
expect(schema.action.description).toContain("createAccess");
149+
expect(schema.action.description).toContain("默认域名访问入口");
150+
expect(schema.targetName.description).toContain("填写函数名");
151+
expect(schema.path.description).toContain("/api/hello");
152+
expect(schema.type.description).toContain("已创建的 HTTP 云函数时传 HTTP");
153+
expect(schema.auth.description).toContain("通常设为 false");
154+
});
155+
144156
it("manageGateway(action=createAccess) should normalize path and return structured payload", async () => {
145157
const result = await tools.manageGateway.handler({
146158
action: "createAccess",
@@ -162,7 +174,7 @@ describe("gateway tools", () => {
162174
expect(payload).toMatchObject({
163175
success: true,
164176
message:
165-
"已为目标 helloFn 创建网关访问路径。注意:路由配置传播通常需要等待 30 秒到 3 分钟,请勿立即访问。",
177+
"已为目标 helloFn 创建网关访问路径。注意:路由配置传播通常需要等待 30 秒到 3 分钟,请勿立即访问。该操作只创建网关入口,不会自动放开函数安全规则;若需要匿名或浏览器直接访问,请继续检查函数资源权限。",
166178
data: {
167179
action: "createAccess",
168180
targetType: "function",
@@ -175,6 +187,17 @@ describe("gateway tools", () => {
175187
action: "getAccess",
176188
reason: "等待 30 秒到 3 分钟后再确认访问入口是否已生效",
177189
}),
190+
expect.objectContaining({
191+
tool: "queryPermissions",
192+
action: "getResourcePermission",
193+
reason:
194+
"确认函数安全规则是否允许预期访问方;网关 auth=false 不等于函数已允许匿名访问",
195+
}),
196+
expect.objectContaining({
197+
tool: "managePermissions",
198+
action: "updateResourcePermission",
199+
reason: "只有在确认需要匿名或浏览器直连访问时,才按实际安全要求更新函数权限",
200+
}),
178201
],
179202
});
180203
});

mcp/src/tools/gateway.ts

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -358,13 +358,23 @@ export function registerGatewayTools(server: ExtendedMcpServer) {
358358
path: accessPath,
359359
raw: result,
360360
},
361-
`已为目标 ${input.targetName} 创建网关访问路径。注意:路由配置传播通常需要等待 30 秒到 3 分钟,请勿立即访问。`,
361+
`已为目标 ${input.targetName} 创建网关访问路径。注意:路由配置传播通常需要等待 30 秒到 3 分钟,请勿立即访问。该操作只创建网关入口,不会自动放开函数安全规则;若需要匿名或浏览器直接访问,请继续检查函数资源权限。`,
362362
[
363363
{
364364
tool: "queryGateway",
365365
action: "getAccess",
366366
reason: "等待 30 秒到 3 分钟后再确认访问入口是否已生效",
367367
},
368+
{
369+
tool: "queryPermissions",
370+
action: "getResourcePermission",
371+
reason: "确认函数安全规则是否允许预期访问方;网关 auth=false 不等于函数已允许匿名访问",
372+
},
373+
{
374+
tool: "managePermissions",
375+
action: "updateResourcePermission",
376+
reason: "只有在确认需要匿名或浏览器直连访问时,才按实际安全要求更新函数权限",
377+
},
368378
],
369379
);
370380
}
@@ -563,17 +573,31 @@ export function registerGatewayTools(server: ExtendedMcpServer) {
563573
{
564574
title: "管理网关域资源",
565575
description:
566-
"网关域统一写入口。通过 action 创建目标访问入口,后续承接更通用的网关配置能力。",
576+
"网关域统一写入口。通过 action 创建目标访问入口,后续承接更通用的网关配置能力。为已存在的 HTTP 云函数补默认域名访问时,通常使用 createAccess 并提供 targetType=\"function\"、targetName、type=\"HTTP\" 与期望 path。注意 createAccess 只创建网关入口,不会自动修改函数资源权限。",
567577
inputSchema: {
568-
action: z.enum(MANAGE_GATEWAY_ACTIONS).describe("写操作类型,例如 createAccess"),
578+
action: z
579+
.enum(MANAGE_GATEWAY_ACTIONS)
580+
.describe("写操作类型,例如 createAccess。为已有函数补默认域名访问入口时使用 createAccess"),
569581
targetType: z
570582
.enum(["function"])
571583
.optional()
572584
.describe("目标资源类型。当前支持 function,后续可扩展"),
573-
targetName: z.string().optional().describe("目标资源名称"),
574-
path: z.string().optional().describe("访问路径,默认 /{targetName}"),
575-
type: z.enum(["Event", "HTTP"]).optional().describe("目标函数的本身类型(非接入形式)。如果被访问的函数是 Event 型(默认),此处必须传 Event;只有当被访问函数在创建时就是 HTTP 函数时才传 HTTP。"),
576-
auth: z.boolean().optional().describe("是否开启鉴权"),
585+
targetName: z
586+
.string()
587+
.optional()
588+
.describe("目标资源名称。createAccess 到云函数时填写函数名"),
589+
path: z
590+
.string()
591+
.optional()
592+
.describe("访问路径,默认 /{targetName}。例如为 HTTP 函数暴露 /api/hello 时传 /api/hello。该参数只创建网关入口,不会自动放开函数资源权限。"),
593+
type: z
594+
.enum(["Event", "HTTP"])
595+
.optional()
596+
.describe("目标函数的运行时类型,不是接入协议。createAccess 到已创建的 HTTP 云函数时传 HTTP;给 Event 函数补网关访问时传 Event 或省略。"),
597+
auth: z
598+
.boolean()
599+
.optional()
600+
.describe("是否开启网关路径鉴权。若要走默认域名做匿名或浏览器访问,通常设为 false;该开关仅控制网关入口本身,不会修改函数资源权限,仍需检查并按需调整函数安全规则。"),
577601
route: z
578602
.object({
579603
routeId: z.string().optional(),

0 commit comments

Comments
 (0)