From b7a1710051a6e5d0113b23c8d72a32a427ab0022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AC=E6=98=8E?= <83812544+Ed1s0nZ@users.noreply.github.com> Date: Thu, 16 Jul 2026 21:15:00 +0800 Subject: [PATCH] Add files via upload --- internal/app/asset_tools.go | 6 +++--- internal/app/asset_tools_test.go | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/internal/app/asset_tools.go b/internal/app/asset_tools.go index 6f7f3820..e299ceeb 100644 --- a/internal/app/asset_tools.go +++ b/internal/app/asset_tools.go @@ -27,9 +27,9 @@ func registerAssetTools(server *mcp.Server, db *database.DB, logger *zap.Logger) server.RegisterTool(mcp.Tool{ Name: builtin.ToolCreateAsset, ShortDescription: "新增或去重更新资产", Description: "向资产库新增资产。按目标+端口+协议去重;若资产已存在则更新非空字段。至少提供 host、ip、domain 之一。", - InputSchema: map[string]interface{}{"type": "object", "properties": properties, "anyOf": []interface{}{ - map[string]interface{}{"required": []string{"host"}}, map[string]interface{}{"required": []string{"ip"}}, map[string]interface{}{"required": []string{"domain"}}, - }}, + // Bedrock rejects tool schemas with top-level oneOf/allOf/anyOf. The + // host/ip/domain requirement is enforced by assetFromCreateArgs below. + InputSchema: map[string]interface{}{"type": "object", "properties": properties}, }, func(ctx context.Context, args map[string]interface{}) (*mcp.ToolResult, error) { asset, err := assetFromCreateArgs(args) if err != nil { diff --git a/internal/app/asset_tools_test.go b/internal/app/asset_tools_test.go index 50cc7222..9cb491b7 100644 --- a/internal/app/asset_tools_test.go +++ b/internal/app/asset_tools_test.go @@ -47,7 +47,23 @@ func TestAssetToolsCRUDQueryAndPageLimit(t *testing.T) { } } - result, _, err := server.CallTool(ctx, builtin.ToolCreateAsset, map[string]interface{}{ + for _, tool := range server.GetAllTools() { + if tool.Name != builtin.ToolCreateAsset { + continue + } + for _, keyword := range []string{"oneOf", "allOf", "anyOf"} { + if _, exists := tool.InputSchema[keyword]; exists { + t.Fatalf("create asset schema contains Bedrock-incompatible top-level %s", keyword) + } + } + } + + result, _, err := server.CallTool(ctx, builtin.ToolCreateAsset, map[string]interface{}{"title": "Missing target"}) + if err != nil || result == nil || !result.IsError { + t.Fatalf("create asset accepted missing host/ip/domain: result=%#v err=%v", result, err) + } + + result, _, err = server.CallTool(ctx, builtin.ToolCreateAsset, map[string]interface{}{ "ip": "192.0.2.42", "port": 443, "protocol": "https", "title": "Before", "tags": []interface{}{"prod"}, }) if err != nil || result == nil || result.IsError {