That's not how it works
You need the numbered parameters $1 $2 $3 etc, or $1- $2- $3- etc.
on *:TEXT:!welcome *:#: {
var %nick = $$2
msg $chan Welcome to the stream, %nick $+ !
}
Changed "!welcome %cloud" to "!welcome *", which means instead of having to match the word "!welcome" followed by whatever the previous value "%cloud" was set to, it now accepts "!welcome <anything>".
Changed "set" to "var" so it's not stored permanently.
Changed "%cloud" to "%nick" because it's more descriptive instead of being a random word.
"$2" means "the second word", which happens to be whatever follows "!welcome".
Using two "$" for "$$2" means the script will halt (stop) if empty (not specified).