| name | manage-pull-requests |
| description | Manage Harness Code pull requests via MCP. List, create, update, and merge PRs; add reviewers and submit review decisions (approve / request changes); post, update, and delete comments; read the discussion timeline; and check CI status. Use when asked to open a PR, merge a PR, approve a PR, leave a code review comment, request changes, assign reviewers, or inspect PR checks and activity. Trigger phrases: pull request, PR review, merge PR, approve PR, request changes, add reviewer, PR comments, PR checks, PR activity, code review. |
| metadata | {"author":"Harness","version":"1.0.0","mcp-server":"harness-mcp-v2"} |
| license | Apache-2.0 |
| compatibility | Requires Harness MCP v2 server (harness-mcp-v2) |
Manage Pull Requests
Manage Harness Code pull requests, reviewers, comments, checks, and activity via MCP v2.
MCP v2 Tools Used
| Tool | Resource Type | Purpose |
|---|
harness_list | pull_request | List PRs in a repo, filter by state |
harness_get | pull_request | Get PR details by number |
harness_create | pull_request | Open a new PR |
harness_update | pull_request | Update PR title / description / state |
harness_execute (action: merge) | pull_request | Merge a PR (merge/squash/rebase/fast-forward) |
harness_list | pr_reviewer | List reviewers on a PR |
harness_create | pr_reviewer | Add a reviewer to a PR |
harness_execute (action: submit_review) | pr_reviewer | Submit an approved or changereq review |
harness_create | pr_comment | Post a top-level or inline code comment |
harness_update | pr_comment | Edit a comment |
harness_delete | pr_comment | Delete a comment |
harness_list | pr_activity | Read the discussion timeline โ the only way to READ comments |
harness_list | pr_check | List CI status checks on a PR |
harness_schema | any of the above | Exact JSON Schema for create / update body fields |
All pull-request resources are repo-scoped. Every call needs repo_id and pr_number (except harness_list for pull_request, which only needs repo_id). org_id / project_id are optional (the server infers them from the repo).
URL shortcut: the MCP server auto-extracts repo_id and pr_number if you pass a Harness PR URL via the url parameter โ e.g. harness_get(resource_type="pull_request", url="https://app.harness.io/ng/account/.../pulls/42").
Instructions
Step 1: List or find the PR
Call MCP tool: harness_list
Parameters:
resource_type: "pull_request"
repo_id: "<repository_identifier>"
state: "open" # optional: open | closed | merged
query: "<keyword>" # optional: full-text search
Or fetch a specific PR:
Call MCP tool: harness_get
Parameters:
resource_type: "pull_request"
repo_id: "<repository_identifier>"
pr_number: <number>
Step 2: Open a PR
Call MCP tool: harness_create
Parameters:
resource_type: "pull_request"
repo_id: "<repository_identifier>"
body:
title: "Fix race condition in scheduler"
source_branch: "fix/scheduler-race"
target_branch: "main"
description: "Resolves HAR-1234. Adds mutex around queue access."
title, source_branch, target_branch are required. description supports markdown.
Step 3: Update PR metadata
Call MCP tool: harness_update
Parameters:
resource_type: "pull_request"
repo_id: "<repo>"
pr_number: <number>
body:
title: "Updated title"
description: "Updated description"
state: "closed" # optional: open | closed
All body fields are optional โ only include what you want to change.
Step 4: Add reviewers
Call MCP tool: harness_create
Parameters:
resource_type: "pr_reviewer"
repo_id: "<repo>"
pr_number: <number>
body:
reviewer_id: <numeric_user_id>
List current reviewers with harness_list(resource_type="pr_reviewer", repo_id, pr_number).
Step 5: Submit a review decision
Call MCP tool: harness_execute
Parameters:
resource_type: "pr_reviewer"
action: "submit_review"
repo_id: "<repo>"
pr_number: <number>
body:
decision: "approved" # approved | changereq
commit_sha: "<sha>" # optional โ the commit you reviewed
Step 6: Post a comment
Top-level comment:
Call MCP tool: harness_create
Parameters:
resource_type: "pr_comment"
repo_id: "<repo>"
pr_number: <number>
body:
text: "LGTM with one nit โ see inline."
Inline code comment:
Call MCP tool: harness_create
Parameters:
resource_type: "pr_comment"
repo_id: "<repo>"
pr_number: <number>
body:
text: "This loop can leak if the context is cancelled."
path: "scheduler/queue.go"
line_new: 142
source_commit_sha: "<source_sha>"
target_commit_sha: "<target_sha>"
Use line_old for comments on removed lines.
Step 7: Read comments โ use pr_activity, not pr_comment
The Harness Code API does not expose GET on /comments. To read the discussion, list PR activity filtered by kind:
Call MCP tool: harness_list
Parameters:
resource_type: "pr_activity"
repo_id: "<repo>"
pr_number: <number>
kind: "comment" # just comments (general + code)
# or type: "code-comment" for inline code review comments only
Other useful type filters: review-submit, reviewer-add, state-change, merge, title-change.
Step 8: Edit or delete a comment
Call MCP tool: harness_update
Parameters:
resource_type: "pr_comment"
repo_id: "<repo>"
pr_number: <number>
comment_id: <numeric_comment_id>
body:
text: "Updated comment body"
Call MCP tool: harness_delete
Parameters:
resource_type: "pr_comment"
repo_id: "<repo>"
pr_number: <number>
comment_id: <numeric_comment_id>
Step 9: Inspect CI checks
Call MCP tool: harness_list
Parameters:
resource_type: "pr_check"
repo_id: "<repo>"
pr_number: <number>
Returns the status of each status check (pipeline, test run, external check) associated with the PR head commit. Use this before merging to confirm required checks are green.
Step 10: Merge
Call MCP tool: harness_execute
Parameters:
resource_type: "pull_request"
action: "merge"
repo_id: "<repo>"
pr_number: <number>
body:
method: "squash" # merge | squash | rebase | fast-forward
delete_source_branch: true
dry_run: false
source_sha: "<expected_sha>" # optional optimistic lock
Set dry_run: true first to preview the merge without executing โ useful before destructive merges.
Examples
Open a PR and request a review
/manage-pull-requests
Open a PR from feat/new-auth into main titled "Add OAuth device flow" on repo platformUI,
and add user 12345 as a reviewer.
Read all unresolved comments on a PR
/manage-pull-requests
Show me every inline code comment on PR 182 in repo harness-core so I can address them.
Approve and merge
/manage-pull-requests
Approve PR 47 in repo mcp-server with a "LGTM" comment, then squash-merge it and delete the branch.
Check CI before merging
/manage-pull-requests
List the checks on PR 99 in repo harness-cli. If they're all green, merge it with a squash.
Close a stale PR
/manage-pull-requests
Close PR 22 in repo harness-skills with a comment explaining we're going in a different direction.
Performance Notes
- Always pass
repo_id + pr_number together except for harness_list(pull_request) which only needs repo_id. Missing pr_number on per-PR calls returns a helpful 400 from the server.
- Read comments via
pr_activity, never pr_comment. The comments endpoint is POST-only. Use kind=comment for all discussion, type=code-comment for inline only.
- Use
dry_run: true on merge before destructive squash/rebase merges โ especially on main branches with required checks.
- Prefer the URL shortcut when the user pastes a PR link.
url="<PR URL>" auto-extracts org_id, project_id, repo_id, and pr_number โ fewer args to get wrong.
pr_reviewer.submit_review records a review independently of the reviewer list. You don't need to call harness_create(pr_reviewer) first to submit a review โ any user with access can review.
- Cross-scope search:
harness_search(query="<text>", resource_types=["pull_request"]) finds PRs across repos when you don't know which repo contains it.
Troubleshooting
"repo_id is required"
All PR operations are repo-scoped. Pass the repo identifier (not the repo name) โ list repos first with harness_list(resource_type="repository") if you're unsure.
Comments don't show up when I list them
pr_comment has no list/get operations. Use harness_list(resource_type="pr_activity", kind="comment") to read the discussion timeline.
"GET /comments not found" / 404 on reading a comment
Same cause as above โ the Harness Code API is POST-only for /comments. Read via pr_activity.
Review decision rejected
Check the decision value โ it must be exactly "approved" or "changereq". The API does not accept "approve" (no d) or "request_changes".
Merge fails with "source SHA mismatch"
You passed source_sha and it no longer matches the branch head (someone pushed after you computed it). Drop source_sha or re-fetch the PR to get the current source_sha.
Inline comment has no diff context
Inline code comments need both source_commit_sha and target_commit_sha in the body โ without them the comment appears as a top-level comment. Get the SHAs from harness_get(pull_request) โ source_sha / target_sha.
Required checks aren't passing but merge succeeded anyway
harness_execute(action=merge) bypasses branch protection if the caller has admin rights. Use harness_list(resource_type="pr_check") first and fail fast in automation if any check is not success.