@azure-devops/mcp 2.0.0-nightly.20250906 → 2.0.0-nightly.20250908

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -199,11 +199,17 @@ function configureRepoTools(server, tokenProvider, connectionProvider, userAgent
199
199
  created_by_me: z.boolean().default(false).describe("Filter pull requests created by the current user."),
200
200
  created_by_user: z.string().optional().describe("Filter pull requests created by a specific user (provide email or unique name). Takes precedence over created_by_me if both are provided."),
201
201
  i_am_reviewer: z.boolean().default(false).describe("Filter pull requests where the current user is a reviewer."),
202
+ user_is_reviewer: z
203
+ .string()
204
+ .optional()
205
+ .describe("Filter pull requests where a specific user is a reviewer (provide email or unique name). Takes precedence over i_am_reviewer if both are provided."),
202
206
  status: z
203
207
  .enum(getEnumKeys(PullRequestStatus))
204
208
  .default("Active")
205
209
  .describe("Filter pull requests by status. Defaults to 'Active'."),
206
- }, async ({ repositoryId, top, skip, created_by_me, created_by_user, i_am_reviewer, status }) => {
210
+ sourceRefName: z.string().optional().describe("Filter pull requests from this source branch (e.g., 'refs/heads/feature-branch')."),
211
+ targetRefName: z.string().optional().describe("Filter pull requests into this target branch (e.g., 'refs/heads/main')."),
212
+ }, async ({ repositoryId, top, skip, created_by_me, created_by_user, i_am_reviewer, user_is_reviewer, status, sourceRefName, targetRefName }) => {
207
213
  const connection = await connectionProvider();
208
214
  const gitApi = await connection.getGitApi();
209
215
  // Build the search criteria
@@ -211,6 +217,12 @@ function configureRepoTools(server, tokenProvider, connectionProvider, userAgent
211
217
  status: pullRequestStatusStringToInt(status),
212
218
  repositoryId: repositoryId,
213
219
  };
220
+ if (sourceRefName) {
221
+ searchCriteria.sourceRefName = sourceRefName;
222
+ }
223
+ if (targetRefName) {
224
+ searchCriteria.targetRefName = targetRefName;
225
+ }
214
226
  if (created_by_user) {
215
227
  try {
216
228
  const userId = await getUserIdFromEmail(created_by_user, tokenProvider, connectionProvider, userAgentProvider);
@@ -228,16 +240,33 @@ function configureRepoTools(server, tokenProvider, connectionProvider, userAgent
228
240
  };
229
241
  }
230
242
  }
231
- else if (created_by_me || i_am_reviewer) {
243
+ else if (created_by_me) {
232
244
  const data = await getCurrentUserDetails(tokenProvider, connectionProvider, userAgentProvider);
233
245
  const userId = data.authenticatedUser.id;
234
- if (created_by_me) {
235
- searchCriteria.creatorId = userId;
246
+ searchCriteria.creatorId = userId;
247
+ }
248
+ if (user_is_reviewer) {
249
+ try {
250
+ const reviewerUserId = await getUserIdFromEmail(user_is_reviewer, tokenProvider, connectionProvider, userAgentProvider);
251
+ searchCriteria.reviewerId = reviewerUserId;
236
252
  }
237
- if (i_am_reviewer) {
238
- searchCriteria.reviewerId = userId;
253
+ catch (error) {
254
+ return {
255
+ content: [
256
+ {
257
+ type: "text",
258
+ text: `Error finding reviewer with email ${user_is_reviewer}: ${error instanceof Error ? error.message : String(error)}`,
259
+ },
260
+ ],
261
+ isError: true,
262
+ };
239
263
  }
240
264
  }
265
+ else if (i_am_reviewer) {
266
+ const data = await getCurrentUserDetails(tokenProvider, connectionProvider, userAgentProvider);
267
+ const userId = data.authenticatedUser.id;
268
+ searchCriteria.reviewerId = userId;
269
+ }
241
270
  const pullRequests = await gitApi.getPullRequests(repositoryId, searchCriteria, undefined, // project
242
271
  undefined, // maxCommentLength
243
272
  skip, top);
@@ -267,17 +296,29 @@ function configureRepoTools(server, tokenProvider, connectionProvider, userAgent
267
296
  created_by_me: z.boolean().default(false).describe("Filter pull requests created by the current user."),
268
297
  created_by_user: z.string().optional().describe("Filter pull requests created by a specific user (provide email or unique name). Takes precedence over created_by_me if both are provided."),
269
298
  i_am_reviewer: z.boolean().default(false).describe("Filter pull requests where the current user is a reviewer."),
299
+ user_is_reviewer: z
300
+ .string()
301
+ .optional()
302
+ .describe("Filter pull requests where a specific user is a reviewer (provide email or unique name). Takes precedence over i_am_reviewer if both are provided."),
270
303
  status: z
271
304
  .enum(getEnumKeys(PullRequestStatus))
272
305
  .default("Active")
273
306
  .describe("Filter pull requests by status. Defaults to 'Active'."),
274
- }, async ({ project, top, skip, created_by_me, created_by_user, i_am_reviewer, status }) => {
307
+ sourceRefName: z.string().optional().describe("Filter pull requests from this source branch (e.g., 'refs/heads/feature-branch')."),
308
+ targetRefName: z.string().optional().describe("Filter pull requests into this target branch (e.g., 'refs/heads/main')."),
309
+ }, async ({ project, top, skip, created_by_me, created_by_user, i_am_reviewer, user_is_reviewer, status, sourceRefName, targetRefName }) => {
275
310
  const connection = await connectionProvider();
276
311
  const gitApi = await connection.getGitApi();
277
312
  // Build the search criteria
278
313
  const gitPullRequestSearchCriteria = {
279
314
  status: pullRequestStatusStringToInt(status),
280
315
  };
316
+ if (sourceRefName) {
317
+ gitPullRequestSearchCriteria.sourceRefName = sourceRefName;
318
+ }
319
+ if (targetRefName) {
320
+ gitPullRequestSearchCriteria.targetRefName = targetRefName;
321
+ }
281
322
  if (created_by_user) {
282
323
  try {
283
324
  const userId = await getUserIdFromEmail(created_by_user, tokenProvider, connectionProvider, userAgentProvider);
@@ -295,16 +336,33 @@ function configureRepoTools(server, tokenProvider, connectionProvider, userAgent
295
336
  };
296
337
  }
297
338
  }
298
- else if (created_by_me || i_am_reviewer) {
339
+ else if (created_by_me) {
299
340
  const data = await getCurrentUserDetails(tokenProvider, connectionProvider, userAgentProvider);
300
341
  const userId = data.authenticatedUser.id;
301
- if (created_by_me) {
302
- gitPullRequestSearchCriteria.creatorId = userId;
342
+ gitPullRequestSearchCriteria.creatorId = userId;
343
+ }
344
+ if (user_is_reviewer) {
345
+ try {
346
+ const reviewerUserId = await getUserIdFromEmail(user_is_reviewer, tokenProvider, connectionProvider, userAgentProvider);
347
+ gitPullRequestSearchCriteria.reviewerId = reviewerUserId;
303
348
  }
304
- if (i_am_reviewer) {
305
- gitPullRequestSearchCriteria.reviewerId = userId;
349
+ catch (error) {
350
+ return {
351
+ content: [
352
+ {
353
+ type: "text",
354
+ text: `Error finding reviewer with email ${user_is_reviewer}: ${error instanceof Error ? error.message : String(error)}`,
355
+ },
356
+ ],
357
+ isError: true,
358
+ };
306
359
  }
307
360
  }
361
+ else if (i_am_reviewer) {
362
+ const data = await getCurrentUserDetails(tokenProvider, connectionProvider, userAgentProvider);
363
+ const userId = data.authenticatedUser.id;
364
+ gitPullRequestSearchCriteria.reviewerId = userId;
365
+ }
308
366
  const pullRequests = await gitApi.getPullRequestsByProject(project, gitPullRequestSearchCriteria, undefined, // maxCommentLength
309
367
  skip, top);
310
368
  // Filter out the irrelevant properties
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const packageVersion = "2.0.0-nightly.20250906";
1
+ export const packageVersion = "2.0.0-nightly.20250908";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@azure-devops/mcp",
3
- "version": "2.0.0-nightly.20250906",
3
+ "version": "2.0.0-nightly.20250908",
4
4
  "description": "MCP server for interacting with Azure DevOps",
5
5
  "license": "MIT",
6
6
  "author": "Microsoft Corporation",