@@ -760,36 +760,36 @@ func DeleteRepository(t translations.TranslationHelperFunc) inventory.ServerTool
760760
761761 fullName := owner + "/" + repo
762762 sealer := requestStateSealerFromDeps (deps )
763- var deletionState * deleteRepositoryState
763+ if sealer == nil {
764+ return utils .NewToolResultError ("Repository deletion is unavailable because request-state protection is not configured." ), nil , nil
765+ }
766+ var deletionState deleteRepositoryState
764767 var responses mcp.InputResponseMap
765768 if req != nil && req .Params != nil {
766769 responses = req .Params .InputResponses
767770 }
768771 response , ok := responses [deleteRepositoryConfirmationID ]
769772 if ! ok {
770- var requestState string
771- if sealer != nil {
772- client , err := deps .GetClient (ctx )
773- if err != nil {
774- return nil , nil , fmt .Errorf ("failed to get GitHub client: %w" , err )
775- }
776- repositoryID , result := repositoryIDForDeletion (ctx , client , owner , repo )
777- if result != nil {
778- return result , nil , nil
779- }
780- state , err := json .Marshal (deleteRepositoryState {
781- Owner : owner ,
782- Repo : repo ,
783- RepositoryID : repositoryID ,
784- ExpiresAt : time .Now ().Add (deleteRepositoryConfirmationTTL ).Unix (),
785- })
786- if err != nil {
787- return nil , nil , fmt .Errorf ("failed to marshal repository deletion state: %w" , err )
788- }
789- requestState , err = sealer .Seal (ctx , state )
790- if err != nil {
791- return nil , nil , fmt .Errorf ("failed to seal repository deletion state: %w" , err )
792- }
773+ client , err := deps .GetClient (ctx )
774+ if err != nil {
775+ return nil , nil , fmt .Errorf ("failed to get GitHub client: %w" , err )
776+ }
777+ repositoryID , result := repositoryIDForDeletion (ctx , client , owner , repo )
778+ if result != nil {
779+ return result , nil , nil
780+ }
781+ state , err := json .Marshal (deleteRepositoryState {
782+ Owner : owner ,
783+ Repo : repo ,
784+ RepositoryID : repositoryID ,
785+ ExpiresAt : time .Now ().Add (deleteRepositoryConfirmationTTL ).Unix (),
786+ })
787+ if err != nil {
788+ return nil , nil , fmt .Errorf ("failed to marshal repository deletion state: %w" , err )
789+ }
790+ requestState , err := sealer .Seal (ctx , state )
791+ if err != nil {
792+ return nil , nil , fmt .Errorf ("failed to seal repository deletion state: %w" , err )
793793 }
794794 return & mcp.CallToolResult {
795795 InputRequests : mcp.InputRequestMap {
@@ -813,28 +813,24 @@ func DeleteRepository(t translations.TranslationHelperFunc) inventory.ServerTool
813813 }, nil , nil
814814 }
815815
816- if sealer != nil {
817- if req .Params .RequestState == "" {
818- return utils .NewToolResultError ("Repository deletion confirmation state was missing. The repository was not deleted." ), nil , nil
819- }
820- stateJSON , err := sealer .Open (req .Params .RequestState )
821- if err != nil {
822- return utils .NewToolResultError ("Repository deletion confirmation state was invalid. The repository was not deleted." ), nil , nil
823- }
824- var state deleteRepositoryState
825- if err := json .Unmarshal (stateJSON , & state ); err != nil {
826- return utils .NewToolResultError ("Repository deletion confirmation state was invalid. The repository was not deleted." ), nil , nil
827- }
828- if state .Owner != owner || state .Repo != repo {
829- return utils .NewToolResultError ("Repository deletion target changed after confirmation was requested. The repository was not deleted." ), nil , nil
830- }
831- if state .ExpiresAt <= time .Now ().Unix () {
832- return utils .NewToolResultError ("Repository deletion confirmation expired. The repository was not deleted." ), nil , nil
833- }
834- if state .RepositoryID == 0 {
835- return utils .NewToolResultError ("Repository deletion confirmation state was invalid. The repository was not deleted." ), nil , nil
836- }
837- deletionState = & state
816+ if req .Params .RequestState == "" {
817+ return utils .NewToolResultError ("Repository deletion confirmation state was missing. The repository was not deleted." ), nil , nil
818+ }
819+ stateJSON , err := sealer .Open (req .Params .RequestState )
820+ if err != nil {
821+ return utils .NewToolResultError ("Repository deletion confirmation state was invalid. The repository was not deleted." ), nil , nil
822+ }
823+ if err := json .Unmarshal (stateJSON , & deletionState ); err != nil {
824+ return utils .NewToolResultError ("Repository deletion confirmation state was invalid. The repository was not deleted." ), nil , nil
825+ }
826+ if deletionState .Owner != owner || deletionState .Repo != repo {
827+ return utils .NewToolResultError ("Repository deletion target changed after confirmation was requested. The repository was not deleted." ), nil , nil
828+ }
829+ if deletionState .ExpiresAt <= time .Now ().Unix () {
830+ return utils .NewToolResultError ("Repository deletion confirmation expired. The repository was not deleted." ), nil , nil
831+ }
832+ if deletionState .RepositoryID == 0 {
833+ return utils .NewToolResultError ("Repository deletion confirmation state was invalid. The repository was not deleted." ), nil , nil
838834 }
839835
840836 confirmation , ok := response .(* mcp.ElicitResult )
@@ -853,14 +849,12 @@ func DeleteRepository(t translations.TranslationHelperFunc) inventory.ServerTool
853849 if err != nil {
854850 return nil , nil , fmt .Errorf ("failed to get GitHub client: %w" , err )
855851 }
856- if deletionState != nil {
857- currentRepositoryID , result := repositoryIDForDeletion (ctx , client , owner , repo )
858- if result != nil {
859- return result , nil , nil
860- }
861- if currentRepositoryID != deletionState .RepositoryID {
862- return utils .NewToolResultError ("Repository identity changed after confirmation was requested. The repository was not deleted." ), nil , nil
863- }
852+ currentRepositoryID , result := repositoryIDForDeletion (ctx , client , owner , repo )
853+ if result != nil {
854+ return result , nil , nil
855+ }
856+ if currentRepositoryID != deletionState .RepositoryID {
857+ return utils .NewToolResultError ("Repository identity changed after confirmation was requested. The repository was not deleted." ), nil , nil
864858 }
865859 resp , err := client .Repositories .Delete (ctx , owner , repo )
866860 if err != nil {
@@ -885,6 +879,7 @@ func DeleteRepository(t translations.TranslationHelperFunc) inventory.ServerTool
885879 )
886880 tool .MinimumProtocolVersion = inventory .ProtocolVersionMultiRoundTrip
887881 tool .RequiredElicitationMode = inventory .ElicitationModeForm
882+ tool .RequiredScopeGroups = scopes .ExpandScopeGroups (scopes .DeleteRepo , scopes .Repo )
888883 return tool
889884}
890885
0 commit comments