how do A and B know the correct merkle path without needing the entire block?
Many light-clients will sync to the longest chain of headers, under the assumption that other nodes on the network will be checking the full content of those blocks for validity. (Consider: if every node was a light-client, miners could include invalid transactions in blocks, and none of the light-clients would know it!)
By requesting the intermediate states of the merkle tree from a node that has the full block, a light-client can verify that a transaction the user is interested in is indeed included in a block that is part of the longest chain, in a more efficient manner than validating the entirety of the block themselves (the caveat being the assumption of validity mentioned above).
Do they need a centralized provider that processes the blocks to calculate these for them? Is it possible to do in a decentralized way?
This entirely depends on the implementation. Some light-wallets might just call back to a certain server, operated by the wallet's developers, for example. Other light-clients might attempt to pull this information from random nodes on the network. Some are even built to connect to your own node.
Ultimately, the highest level of certainty will come from running a fully-validating node yourself (ie, a full node). As bitcoiners like to say: don't trust, verify.