1 Compétitions officielles nationales et internationales senior, incluant le parcours amateur et en équipe réserve. 2 Matchs officiels. Dernière mise à jour : 28 août 2023
En , il s'engage auprès des Black Knights de l'académie militaire de West Point[5],[6]. Le , il inscrit un but et distribue une passe décisive face aux Raiders de Colgate[7]. Quelques jours plus tard, il est également nommé rookie de la semaine de la Patriot League[8]. Il est nommé dans l'équipe-type de la Patriot League le [9]. Lors du banquet annuel organisé par son académie, il est élu nouveau venu de l'année[10].
Avant le début de la saison, il est élu joueur défensif, puis nommé dans l'équipe-type de présaison de la Patriot League le [11]. Le , il est sélectionné dans la première équipe-type de la Patriot League pour la deuxième année consécutive[12]. Puis, il est élu joueur défensif de l’année de la Patriot League, en jouant un rôle central dans le succès défensif de l'Army au cours de la saison[13]. Il est nommé dans l'équipe-type du Nord-Est des United Soccer Coaches(en) le [14].
Lors de sa troisième année à West Point, il est nommé co-capitaine[15],[16], avec Tyler Mitchiner et Grayson Naquin[17]. Il est de nouveau élu joueur défensif, et également nommé dans l'équipe-type de présaison de la Patriot League le [18]. Son nom figure sur une liste de trente-et-un joueurs sélectionnés pour le trophée Hermann[19]. Il est nommé pour la troisième fois de suite dans l'équipe-type de la Patriot League le [20]. Une semaine plus tard, il perd la finale du tournoi de la Patriot League(en) face aux Raiders de Colgate[21]. Les Black Knights disputent leur première finale depuis 1996[22]. Il est également nommé dans l'équipe-type du tournoi[23]. Puis, il est nommé dans l'équipe-type du Nord-Est des United Soccer Coaches(en) le [24].
Il est de nouveau nommé co-capitaine[15],[16], avec Tyler Mitchiner[25]. Il est élu joueur défensif, et nommé dans l'équipe-type de présaison — pour la troisième fois consécutive — de la Patriot League, le [26]. Il est également nommé dans l'équipe-type de présaison de College Soccer News et de TopDrawerSoccer(en)[27],[28]. Membre d'une liste de trente-six joueurs sélectionnés pour le trophée Hermann[29]. À la fin de la saison régulière, il est nommé dans la deuxième équipe-type de la Patriot League[30], puis dans la troisième équipe-type du Nord-Est des United Soccer Coaches(en)[31].
Le , les Timbers de Portland sélectionnent Zac McGraw lors du troisième tour — soixante-huitième choix au total — du repêchage universitaire de la Major League Soccer[34]. Il devient le premier joueur de l'Army à être sélectionné pour la séance de repêchage de la MLS[16],[35]. C'est seulement le troisième joueur issu d'une académie militaire américaine à être repêché par une équipe de la MLS, après Joseph Greenspan et Tucker Bone[36]. Il signe son premier contrat professionnel avec les Timbers le [35],[37]. Il devient le deuxième joueur diplômé d'une académie militaire du pays à signer un contrat avec un club de la MLS, après Joseph Greenspan — diplômé de la Navy — en 2015[38],[39]. Néanmoins, il reste cantonné à un rôle en remplaçant, lors de sa première saison[40]. Le , son contrat est renouvelé par les Timbers[40],[41].
Le , il fait ses débuts en MLS, entrant en jeu dans une défaite 4-1 contre le FC Dallas[42]. Il devient le premier joueur de l'Army à jouer une rencontre de MLS et le second issu d'une académie militaire — après Joseph Greenspan[42]. Le , le club annonce que son contrat est renouvelé[43].
En début de saison, il obtient deux titularisations consécutives pour la première fois de sa carrière avec les Timbers[44], à la suite des blessures de deux cadres[45]. Au cours du match contre le Los Angeles FC, le , il effectue quinze dégagements, et devient le troisième joueur des Timbers à enregistrer quinze dégagements ou plus en un seul match[46]. Le , il inscrit son premier but en MLS, face à l'Austin FC[47],[48]. Il devient le douzième joueur à marquer pour Portland cette saison[49]. Il est également nommé dans l'équipe-type de la semaine 28[50],[51]. Le , il prolonge son contrat de trois années avec son club — jusqu'en 2025 — et l’entente est également assortie d’une option pour 2026[52],[53]. Il commence petit à petit à se faire une place dans l'équipe[54].
À la suite du départ de Bill Tuiloma, il devient titulaire en défense centrale[3].
Son nom figure sur une liste provisoire de soixante joueurs canadiens appelés à participer à la Gold Cup[58],[59], il figure dans la liste définitive de vingt-trois joueurs pour disputer la compétition[55],[60],[61]. « C'est une belle opportunité », selon lui[57]. Il honore sa première sélection en tant que titulaire contre la Guadeloupe — lors du premier match de poules — le [62],[63]. Le Canada s'incline en quart de finale aux tirs au but, face aux États-Unis[64].