See <https://en.wikipedia.org/wiki/Secure_copy_protocol>
SFTP also transports data over SSH channels.
I guess you can call it a (application) protocol. However, when implementing this I've not needed to anything to make scp works as opposed to anything else. Just supporting ssh executions requests and connecting the channels as you do with any remote invocation.
I've written a few custom ssh servers and you don't really need to do anything to them to support scp.
sftp uses the sftp subsystem. scp just uses regular ssh requests and transports data over the ssh channels.