diff --git a/pkg/inventory/server_tool.go b/pkg/inventory/server_tool.go index 326009b59..57ec80d2c 100644 --- a/pkg/inventory/server_tool.go +++ b/pkg/inventory/server_tool.go @@ -133,7 +133,11 @@ func NewServerToolWithContextHandler[In any, Out any](tool mcp.Tool, toolset Too HandlerFunc: func(_ any) mcp.ToolHandler { return func(ctx context.Context, req *mcp.CallToolRequest) (*mcp.CallToolResult, error) { var arguments In - if err := json.Unmarshal(req.Params.Arguments, &arguments); err != nil { + args := req.Params.Arguments + if len(args) == 0 { + args = json.RawMessage(`{}`) + } + if err := json.Unmarshal(args, &arguments); err != nil { return &mcp.CallToolResult{ Content: []mcp.Content{ &mcp.TextContent{Text: fmt.Sprintf("invalid arguments: %s", err)}, diff --git a/pkg/inventory/server_tool_test.go b/pkg/inventory/server_tool_test.go index 69cee94af..62244408b 100644 --- a/pkg/inventory/server_tool_test.go +++ b/pkg/inventory/server_tool_test.go @@ -78,3 +78,29 @@ func TestNewServerToolWithContextHandler_ValidArguments_Succeeds(t *testing.T) { require.True(t, ok) assert.Equal(t, "success: octocat/hello-world", textContent.Text) } + +func TestNewServerToolWithContextHandler_NilArguments_TreatedAsEmptyObject(t *testing.T) { + tool := NewServerToolWithContextHandler( + mcp.Tool{Name: "zero_arg_tool"}, + testToolsetMetadata("test"), + func(_ context.Context, _ *mcp.CallToolRequest, args map[string]any) (*mcp.CallToolResult, any, error) { + return &mcp.CallToolResult{ + Content: []mcp.Content{ + &mcp.TextContent{Text: "ok"}, + }, + }, args, nil + }, + ) + + handler := tool.HandlerFunc(nil) + result, err := handler(context.Background(), &mcp.CallToolRequest{ + Params: &mcp.CallToolParamsRaw{ + Name: "zero_arg_tool", + Arguments: nil, + }, + }) + + require.NoError(t, err) + require.NotNil(t, result) + assert.False(t, result.IsError) +}