bedtools intersect would indeed be a reasonable choice, e.g.
bedtools intersect -a 1.narrowpeak -b 2.narrowpeak -u | bedtools intersect -a - -b 3.narrowpeak -u | cut -f1-3 > reproducible.bed
If you want summits (given that the center position of reproducible.bed does not serve as a sufficient proxy) you can merge all three replicates at more or less equal contribution (equal number of reads each) and call peaks on this. Then intersect this peak file with reproducible.bed to get summits that more or less represent the "average" in the dataset.
Keep in mind tough that this is a pretty stringent way of filtering. Maybe one of the samples is of poor quality so 3-way intersection would massively reduce the number of peaks in the output even tough two samples might be totally fine. Be sure to only use good-quality samples.
I would recomment to use a "consenus" peak set which contains peaks found at least in two of your replicates. Here is a description of how to: https://ro-che.info/articles/2018-07-11-chip-seq-consensus