diff --git a/app/assets/javascripts/merge_requests/list/components/merge_requests_list_app.vue b/app/assets/javascripts/merge_requests/list/components/merge_requests_list_app.vue
index a587f119f90aa745638740f2937beefc745820cd..f03419fbe3d5cc2dd493e403bb0d83518aae98a7 100644
--- a/app/assets/javascripts/merge_requests/list/components/merge_requests_list_app.vue
+++ b/app/assets/javascripts/merge_requests/list/components/merge_requests_list_app.vue
@@ -206,7 +206,7 @@ export default {
           icon: 'user',
           token: UserToken,
           dataType: 'user',
-          operators: OPERATORS_IS,
+          operators: OPERATORS_IS_NOT,
           fullPath: this.fullPath,
           isProject: true,
           recentSuggestionsStorageKey: `${this.fullPath}-merge-requests-recent-tokens-reviewer`,
diff --git a/app/graphql/resolvers/merge_requests_resolver.rb b/app/graphql/resolvers/merge_requests_resolver.rb
index b4e46fdb6c0266641058cf6e003965ec9c9d03e9..73c2dcd7d4a284e239873f71b0128fc79cc674ba 100644
--- a/app/graphql/resolvers/merge_requests_resolver.rb
+++ b/app/graphql/resolvers/merge_requests_resolver.rb
@@ -135,6 +135,9 @@ def self.accept_reviewer
       argument :milestone_title, GraphQL::Types::String,
         required: false,
         description: 'Title of the milestone.'
+      argument :reviewer_username, GraphQL::Types::String,
+        required: false,
+        description: 'Username of the reviewer.'
     end
 
     validates mutually_exclusive: [:assignee_username, :assignee_wildcard_id]
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 74356de3090373f922991c6fc9d310cc68a3ffc1..722c6b4e241d36f67ae5d13bdb1ffd84200ef879 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -39726,6 +39726,7 @@ Defines which user roles, users, or groups can merge into a protected branch.
 | <a id="mergerequestsresolvernegatedparamsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of the assignee to exclude. |
 | <a id="mergerequestsresolvernegatedparamslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will not have these labels. |
 | <a id="mergerequestsresolvernegatedparamsmilestonetitle"></a>`milestoneTitle` | [`String`](#string) | Title of the milestone. |
+| <a id="mergerequestsresolvernegatedparamsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
 
 ### `MonthSelectionInput`
 
diff --git a/spec/frontend/merge_requests/list/components/merge_requests_list_app_spec.js b/spec/frontend/merge_requests/list/components/merge_requests_list_app_spec.js
index d51368758930154df56731f5db0cf92162f42549..ea3780bf6f30c740b26b1cfb36c1175ff40a8ab5 100644
--- a/spec/frontend/merge_requests/list/components/merge_requests_list_app_spec.js
+++ b/spec/frontend/merge_requests/list/components/merge_requests_list_app_spec.js
@@ -208,11 +208,18 @@ describe('Merge requests list app', () => {
             type: 'assignee',
             value: { data: ['root'], operator: OPERATOR_IS },
           },
+          {
+            type: 'reviewer',
+            value: { data: 'root', operator: OPERATOR_IS },
+          },
         ]);
         await nextTick();
 
         expect(router.push).toHaveBeenCalledWith({
-          query: expect.objectContaining({ 'assignee_username[]': ['root'] }),
+          query: expect.objectContaining({
+            'assignee_username[]': ['root'],
+            reviewer_username: 'root',
+          }),
         });
       });
 
@@ -224,19 +231,23 @@ describe('Merge requests list app', () => {
             type: 'assignee',
             value: { data: ['root'], operator: OPERATOR_NOT },
           },
+          {
+            type: 'reviewer',
+            value: { data: 'root', operator: OPERATOR_NOT },
+          },
         ]);
 
         await nextTick();
 
         expect(getQueryResponseMock).toHaveBeenCalledWith(
           expect.objectContaining({
-            not: { assigneeUsernames: ['root'] },
+            not: { assigneeUsernames: ['root'], reviewerUsername: 'root' },
           }),
         );
 
         expect(getCountsQueryResponseMock).toHaveBeenCalledWith(
           expect.objectContaining({
-            not: { assigneeUsernames: ['root'] },
+            not: { assigneeUsernames: ['root'], reviewerUsername: 'root' },
           }),
         );
       });
@@ -249,12 +260,19 @@ describe('Merge requests list app', () => {
             type: 'assignee',
             value: { data: ['root'], operator: OPERATOR_NOT },
           },
+          {
+            type: 'reviewer',
+            value: { data: 'root', operator: OPERATOR_NOT },
+          },
         ]);
 
         await nextTick();
 
         expect(router.push).toHaveBeenCalledWith({
-          query: expect.objectContaining({ 'not[assignee_username][]': ['root'] }),
+          query: expect.objectContaining({
+            'not[assignee_username][]': ['root'],
+            'not[reviewer_username]': 'root',
+          }),
         });
       });
     });
diff --git a/spec/graphql/resolvers/merge_requests_resolver_spec.rb b/spec/graphql/resolvers/merge_requests_resolver_spec.rb
index af24c7db14f4f6af1467158e96f99b835ea52201..bd7a68da5ef090c461f56e89dc607820a42fb4ba 100644
--- a/spec/graphql/resolvers/merge_requests_resolver_spec.rb
+++ b/spec/graphql/resolvers/merge_requests_resolver_spec.rb
@@ -13,7 +13,7 @@
   let_it_be(:other_user) { create(:user) }
   let_it_be(:common_attrs) { { author: current_user, source_project: project, target_project: project } }
   let_it_be(:merge_request_1) { create(:merge_request, :simple, reviewers: create_list(:user, 2), **common_attrs) }
-  let_it_be(:merge_request_2) { create(:merge_request, :rebased, **common_attrs) }
+  let_it_be(:merge_request_2) { create(:merge_request, :rebased, reviewers: [current_user], **common_attrs) }
   let_it_be(:merge_request_3) { create(:merge_request, :unique_branches, assignees: [current_user], **common_attrs) }
   let_it_be(:merge_request_4) { create(:merge_request, :unique_branches, :locked, **common_attrs) }
   let_it_be(:merge_request_5) { create(:merge_request, :simple, :locked, **common_attrs) }
@@ -402,6 +402,14 @@
           expect(result).to contain_exactly(merge_request_1, merge_request_2, merge_request_4, merge_request_5, merge_request_6, merge_request_with_milestone)
         end
       end
+
+      context 'with reviewer' do
+        it do
+          result = resolve_mr(project, not: { reviewer_username: current_user.username })
+
+          expect(result).to contain_exactly(merge_request_1, merge_request_3, merge_request_4, merge_request_5, merge_request_6, merge_request_with_milestone)
+        end
+      end
     end
 
     describe 'sorting' do
diff --git a/spec/graphql/resolvers/project_merge_requests_resolver_spec.rb b/spec/graphql/resolvers/project_merge_requests_resolver_spec.rb
index ac50a1b2793ebe2e7b159b884005e122471824b7..914b452acea5fff5c0f510aadf1228f6ee30f069 100644
--- a/spec/graphql/resolvers/project_merge_requests_resolver_spec.rb
+++ b/spec/graphql/resolvers/project_merge_requests_resolver_spec.rb
@@ -156,6 +156,14 @@
         expect(result).to contain_exactly(merge_request2)
       end
     end
+
+    context 'with negated reviewer username' do
+      it do
+        result = resolve_mr(project, not: { reviewer_username: reviewer.username })
+
+        expect(result).to contain_exactly(merge_request2)
+      end
+    end
   end
 
   def resolve_mr(project, resolver: described_class, user: current_user, **args)