Skip to content
Back to skills

Omc Ado Review

ASecurity

Review Azure DevOps pull requests: read diffs, add reviewers, comment, vote, and manage PR threads. Not for automated review (omc-ado-auto-review), triage, or GitHub repos (omc-gh-review). Creating PRs → git-master.

  • 5 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 5, 2026
ai-agentsbashreactnodeazuregitdevops

Works with

  • cli
  • mcp

Security analysis

A100/100

Scanned October 5, 2026

npx -y skills add RobinNorberg/oh-my-copilot --skill omc-ado-review --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Omc Ado Review?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Omc Ado Review
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/robinnorberg-omc-ado-review/badge)](https://www.skillsdirectory.com/skills/robinnorberg-omc-ado-review)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: omc-ado-review
description: "Review Azure DevOps pull requests: read diffs, add reviewers, comment, vote, and manage PR threads. Not for automated review (omc-ado-auto-review), triage, or GitHub repos (omc-gh-review). Creating PRs → git-master."
---

# OMC ADO Review

Perform a full Azure DevOps pull request review cycle. Reads `.omg/config.json` for connection settings, lists open PRs, surfaces existing review threads, and supports adding comments, managing reviewers, and updating PR status.

**When this skill is invoked, immediately execute the workflow below. Do not only restate or summarize these instructions back to the user.**

## Trigger Patterns

- "ado review"
- "review pr"
- "review pull request"
- "add reviewer"
- "pr comments"
- "vote on pr"
- "manage pr threads"
- "omc-ado-review"

---

## Step 1: Load Configuration

Read `.omg/config.json`:

```bash
node -e "const f=require('fs');try{process.stdout.write(f.readFileSync('.omg/config.json','utf8'))}catch{console.log('NOT_FOUND')}"
```

Extract from the `ado` key:
- `org` — full org URL (e.g. `https://dev.azure.com/contoso`)
- `project` — ADO project name
- `repo` — repository name

If config is NOT_FOUND or missing the `ado` key: tell the user to run `/oh-my-copilot:omc-ado-setup` first and stop.

---

## Step 2: List Open PRs

Fetch all active pull requests for the configured repository.

MCP (preferred):
```
mcp__azure-devops__repo_list_pull_requests_by_repo_or_project
  → repositoryId: "{repo}"
  → project: "{project}"
  → status: "active"
```

az CLI fallback:
```bash
az repos pr list \
  --repository "{repo}" \
  --project "{project}" \
  --org "{org}" \
  --status active \
  -o json 2>&1
```

Present results in a table:

```
### Open Pull Requests ({N})
| ID | Title | Author | Target Branch | Reviewers | Age |
|----|-------|--------|--------------|-----------|-----|
| !42 | Add retry logic    | alice | main | 2 of 3 approved | 3d |
| !43 | Fix login timeout  | bob   | dev  | No votes yet    | 1d |
```

For each PR, summarize reviewer vote status:
- `-10` = Rejected
- `-5` = Waiting for author
- `0` = No vote
- `5` = Approved with suggestions
- `10` = Approved

If there are no open PRs, report "(0)" and ask the user if they want to check a specific PR by ID.

---

## Step 3: Select PR for Review

Prompt the user to select a PR from the list, or accept a PR ID directly.

Fetch full PR details:

MCP (preferred):
```
mcp__azure-devops__repo_get_pull_request_by_id
  → pullRequestId: {prId}
  → project: "{project}"
```

az CLI fallback:
```bash
az repos pr show \
  --id {prId} \
  --org "{org}" \
  -o json 2>&1
```

Display a summary:

```
### PR !{id}: {title}
Author:        {author}
Source:        {sourceBranch} → {targetBranch}
Created:       {createdDate}
Description:   {description}
Work Items:    #{id} {title}
Reviewers:     {name} ({voteLabel}), ...
Auto-complete: {enabled/disabled}
```

---

## Step 4: Review Changes

Fetch existing review threads and comments to understand the current review state before adding new feedback.

**4a. List PR threads:**

MCP (preferred):
```
mcp__azure-devops__repo_list_pull_request_threads
  → repositoryId: "{repo}"
  → pullRequestId: {prId}
  → project: "{project}"
```

**4b. Read thread comments (for active threads):**

MCP (preferred):
```
mcp__azure-devops__repo_list_pull_request_thread_comments
  → repositoryId: "{repo}"
  → pullRequestId: {prId}
  → threadId: {threadId}
  → project: "{project}"
```

Present a summary of threads:

```
### Review Threads ({N} active, {N} resolved)
| Thread | File | Comment | Author | Status |
|--------|------|---------|--------|--------|
| #1 | src/auth.ts:42 | "Should handle null case" | charlie | Active |
| #2 | — (general) | "LGTM overall" | alice | Resolved |
```

If there are no threads, note "No review threads yet."

---

## Step 5: Add Review Comments

Create new review feedback as threads. Threads can target a specific file/line or be general PR-level comments.

**File-level comment:**

MCP (preferred):
```
mcp__azure-devops__repo_create_pull_request_thread
  → repositoryId: "{repo}"
  → pullRequestId: {prId}
  → project: "{project}"
  → comments: [{ content: "{comment}", commentType: 1 }]
  → threadContext: { filePath: "{filePath}", rightFileStart: { line: {lineNumber}, offset: 1 }, rightFileEnd: { line: {lineNumber}, offset: 1 } }
  → status: 1
```

**General PR comment:**

MCP (preferred):
```
mcp__azure-devops__repo_create_pull_request_thread
  → repositoryId: "{repo}"
  → pullRequestId: {prId}
  → project: "{project}"
  → comments: [{ content: "{comment}", commentType: 1 }]
  → status: 1
```

az CLI fallback:
```bash
az repos pr comment create \
  --id {prId} \
  --content '{comment}' \
  --org "{org}" \
  -o json 2>&1
```

**Reply to an existing thread:**

MCP (preferred):
```
mcp__azure-devops__repo_reply_to_comment
  → repositoryId: "{repo}"
  → pullRequestId: {prId}
  → threadId: {threadId}
  → project: "{project}"
  → content: "{reply}"
```

az CLI fallback:
```bash
az repos pr comment create \
  --id {prId} \
  --content '{reply}' \
  --reply-id {commentId} \
  --thread-id {threadId} \
  --org "{org}" \
  -o json 2>&1
```

Confirm after each action:
```
Added comment to PR !{id} on {filePath}:{line}
```

---

## Step 6: Manage Reviewers

Add or remove reviewers from the PR.

MCP (preferred):
```
mcp__azure-devops__repo_update_pull_request_reviewers
  → repositoryId: "{repo}"
  → pullRequestId: {prId}
  → project: "{project}"
  → reviewers: [{ id: "{userId}", vote: 0, isRequired: true }]
```

To find a reviewer's user ID, use:
```
mcp__azure-devops__core_get_identity_ids
  → identities: ["{email or display name}"]
```

az CLI fallback:
```bash
az repos pr reviewer add \
  --id {prId} \
  --reviewers "{email}" \
  --org "{org}" \
  -o json 2>&1
```

To remove a reviewer:
```bash
az repos pr reviewer remove \
  --id {prId} \
  --reviewers "{email}" \
  --org "{org}" \
  -o json 2>&1
```

Confirm:
```
Added {name} as reviewer on PR !{id}
```

---

## Step 7: Update PR Status

Cast a vote, enable auto-complete, set draft status, or abandon/reactivate the PR.

MCP (preferred):
```
mcp__azure-devops__repo_update_pull_request
  → repositoryId: "{repo}"
  → pullRequestId: {prId}
  → project: "{project}"
  → [one or more of the following fields:]
      status: "active" | "abandoned" | "completed"
      isDraft: true | false
      autoCompleteSetBy: { id: "{userId}" }
      mergeStrategy: "squash" | "rebase" | "rebaseMerge" | "noFastForward"
```

To cast a vote (approve/reject), update the reviewer entry:
```
mcp__azure-devops__repo_update_pull_request_reviewers
  → reviewers: [{ id: "{currentUserId}", vote: 10 }]
  (vote: 10=Approved, 5=Approved with suggestions, 0=No vote, -5=Waiting for author, -10=Rejected)
```

az CLI fallback:
```bash
# Set status
az repos pr update \
  --id {prId} \
  --status {active|abandoned|completed} \
  --org "{org}" \
  -o json 2>&1

# Vote (approve)
az repos pr set-vote \
  --id {prId} \
  --vote approve \
  --org "{org}" \
  -o json 2>&1

# Enable auto-complete
az repos pr update \
  --id {prId} \
  --auto-complete true \
  --merge-strategy squash \
  --org "{org}" \
  -o json 2>&1
```

Confirm:
```
Updated PR !{id}: {change description}
```

---

## MCP Tool Reference

| Tool | Purpose |
|------|---------|
| `repo_list_pull_requests_by_repo_or_project` | List open PRs |
| `repo_get_pull_request_by_id` | Get PR details |
| `repo_create_pull_request_thread` | Create review comment thread |
| `repo_list_pull_request_threads` | List existing PR threads |
| `repo_list_pull_request_thread_comments` | Read thread comments |
| `repo_reply_to_comment` | Reply to existing thread |
| `repo_update_pull_request_reviewers` | Add/remove reviewers |
| `repo_update_pull_request` | Update PR status/properties |

---

## az CLI Fallback Commands

Use these when MCP tools are not available in the current session:

```bash
# List open PRs
az repos pr list \
  --repository "{repo}" --project "{project}" --org "{org}" \
  --status active -o table

# Show PR details
az repos pr show --id {prId} --org "{org}" -o json

# Add a comment
az repos pr comment create \
  --id {prId} --content '{comment}' --org "{org}" -o json

# List comments
az repos pr comment list --id {prId} --org "{org}" -o table

# Add a reviewer
az repos pr reviewer add \
  --id {prId} --reviewers "{email}" --org "{org}" -o json

# Vote on a PR
az repos pr set-vote \
  --id {prId} --vote {approve|reject|wait|reset} --org "{org}" -o json

# Update PR status
az repos pr update --id {prId} --status {status} --org "{org}" -o json
```

---

## Error Handling

| Error | Action |
|-------|--------|
| `.omg/config.json` missing | Tell user to run `/oh-my-copilot:omc-ado-setup` first |
| `az login` required | Prompt user to authenticate; do not abort — skip that section |
| PR not found | Verify PR ID and that the repository name in config matches ADO |
| Reviewer identity not found | Use `core_get_identity_ids` to look up the user by email; prompt user to provide full email address |
| Permission denied on vote | User may not be listed as a reviewer; add themselves first via Step 6 |
| Thread update fails | Verify thread is still `Active`; resolved threads cannot receive new replies |
| Rate limit / 429 | Wait 2 seconds and retry once; if still failing, note the section as unavailable |

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.