Adams was making his 25th top-flight appearance for Saints since his £15million signing just over a year ago, but he picked a fine time to break his duck.
City rested Kevin De Bruyne and Phil Foden, among others, after crushing champion Liverpool midweek and lacked fluency from the outset at St Mary's, although Adams's wonderful finish preceded a flurry of chances for Pep Guardiola's men.
Goalkeeper Alex McCarthy was in inspired form, however, and the host held on to hand City its ninth league defeat of the season and its third in a row away from home.
The second-placed side was made to pay for its sloppy start when Stuart Armstrong stole possession from Oleksandr Zinchenko on halfway and the ball ran for Adams – without a goal since April 2019 – to sweep a stunning 40-yard effort over the stranded Ederson and into a gaping net.
Pressure subsequently built on the Southampton goal, where McCarthy watched Gabriel Jesus miss the target from close range before getting to work.
In a frantic spell, McCarthy parried from Raheem Sterling, dived after a Fernandinho shot that bounced away off the post and then sprang back to his feet to brilliantly repel David Silva's header.
Riyad Mahrez was next to find the inspired keeper blocking his path, before a stretching Danny Ings volleyed over when he might have doubled Saints' lead just before half-time.
McCarthy was at it again following the interval, keeping out Jesus' header and then smothering from Silva after a pinpoint Zinchenko pass.
De Bruyne and Foden soon arrived from the bench, but the withdrawals of Mahrez and Sterling only seemed to hurt City further and Ederson had to stop an Armstrong blast as his side stuttered to a surprise loss despite applying plenty of late pressure.