mcpField
G
gitlab-discussion

gitlab-discussion

github.com/grandcamelDevelopment492 installsUpdated 41w ago
Repository

About gitlab-discussion

A GitLab discussion-management skill for working with merge request and issue threads through `glab api`. It documents read and write operations, line-specific comments, resolution, and permission requirements.

Key features

  1. 01Lists and retrieves discussions
  2. 02Creates issue and MR threads
  3. 03Adds line-specific diff comments
  4. 04Replies, edits, and resolves threads
  5. 05Documents token scopes and permissions

Use cases

  1. 01Reviewing MR discussion activity
  2. 02Posting comments on changed lines
  3. 03Resolving or replying to review threads

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/grandcamel/gitlab-assistant-skills --skill gitlab-discussion

After installing, type/gitlab-discussionin Claude Code to confirm it loaded.

Details

From the project README

Discussion Skill

Threaded discussion management for GitLab using glab api raw endpoint calls.

Quick Reference

OperationCommand PatternRisk
List MR discussionsglab api projects/:id/merge_requests/:iid/discussions-
List issue discussionsglab api projects/:id/issues/:iid/discussions-
Get discussionglab api projects/:id/merge_requests/:iid/discussions/:id-
Create discussionglab api projects/:id/merge_requests/:iid/discussions -X POST -f ...⚠️
Reply to discussionglab api projects/:id/.../discussions/:id/notes -X POST -f ...⚠️
Resolve discussionglab api projects/:id/.../discussions/:id -X PUT -f resolved=true⚠️
Delete noteglab api projects/:id/.../discussions/:id/notes/:nid -X DELETE⚠️⚠️

Risk Legend: - Safe | ⚠️ Caution | ⚠️⚠️ Warning | ⚠️⚠️⚠️ Danger

When to Use This Skill

ALWAYS use when:

  • User mentions "discussion", "thread", "conversation"
  • User wants to add code review comments
  • User mentions "resolve", "unresolve" discussions
  • User wants to reply to existing comments/threads
  • User wants line-specific comments on MRs

NEVER use when:

  • User wants simple notes/comments (use glab mr note or glab issue note)
  • User wants to review MR changes (use gitlab-mr)
  • User wants to search comments (use gitlab-search with notes scope)

API Prerequisites

Required Token Scopes: api

Permissions:

  • Read discussions: Reporter+ (for private repos)
  • Create discussions: Reporter+
  • Resolve discussions: Developer+ (or MR author)

Available Commands

List MR Discussions
# List all discussions on MR
glab api projects/123/merge_requests/1/discussions --method GET

# With pagination
glab api projects/123/merge_requests/1/discussions --paginate

# Using project path
glab api "projects/$(echo 'mygroup/myproject' | jq -Rr @uri)/merge_requests/1/discussions"
List Issue Discussions
# List all discussions on issue
glab api projects/123/issues/42/discussions --method GET

# With pagination
glab api projects/123/issues/42/discussions --paginate
Get Specific Discussion
# Get MR discussion by ID
glab api projects/123/merge_requests/1/discussions/abc123 --method GET

# Get issue discussion by ID
glab api projects/123/issues/42/discussions/def456 --method GET
Create Discussion on MR
# Create general discussion
glab api projects/123/merge_requests/1/discussions --method POST \
  -f body="This looks good overall, but I have some suggestions."

# Create discussion on specific line (diff note)
glab api projects/123/merge_requests/1/discussions --method POST \
  -f body="This could be simplified using a helper function." \
  -f position[base_sha]="abc123" \
  -f position[head_sha]="def456" \
  -f position[start_sha]="abc123" \
  -f position[position_type]="text" \
  -f position[new_path]="src/app.py" \
  -f position[new_line]=42

# Create discussion on old line (removed code)
glab api projects/123/merge_requests/1/discussions --method POST \
  -f body="Why was this removed?" \
  -f position[base_sha]="abc123" \
  -f position[head_sha]="def456" \
  -f position[start_sha]="abc123" \
  -f position[position_type]="text" \
  -f position[old_path]="src/old.py" \
  -f position[old_line]=15

# Create suggestion
glab api projects/123/merge_requests/1/discussions --method POST \
  -f body='```suggestion
def improved_function():
    return "better implementation"
```'
Create Discussion on Issue
# Create discussion
glab api projects/123/issues/42/discussions --method POST \
  -f body="I think we should reconsider this approach."
Reply to Discussion
# Reply to MR discussion
glab api projects/123/merge_requests/1/discussions/abc123/notes --method POST \
  -f body="Good point, I'll fix this."

# Reply to issue discussion
glab api projects/123/issues/42/discussions/def456/notes --method POST \
  -f body="I agree with the above."
Resolve/Unresolve Discussion
# Resolve MR discussion
glab api projects/123/merge_requests/1/discussions/abc123 --method PUT \
  -f resolved=true

# Unresolve MR discussion
glab api projects/123/merge_requests/1/discussions/abc123 --method PUT \
  -f resolved=false
Update Note
# Update note in discussion
glab api projects/123/merge_requests/1/discussions/abc123/notes/789 --method PUT \
  -f body="Updated comment text"
Delete Note
# Delete note from discussion
glab api projects/123/merge_requests/1/discussions/abc123/notes/789 --method DELETE

Position Object for Diff Notes

For line-specific comments on MRs, you need to provide position information:

FieldRequiredDescription
base_shaYesSHA of the base commit (target branch)
head_shaYesSHA of the head commit (source branch)
start_shaYesSHA of the start commit
position_typeYestext for code, image for images
new_pathFor new/modifiedPath in new version
new_lineFor new/modifiedLine number in new version
old_pathFor deletedPath in old version
old_lineFor deletedLine number in old version
Get SHAs for Position
# Get MR details to find SHAs
mr_info=$(glab api projects/123/merge_requests/1)
base_sha=$(echo "$mr_info" | jq -r '.diff_refs.base_sha')
head_sha=$(echo "$mr_info" | jq -r '.diff_refs.head_sha')
start_sha=$(echo "$mr_info" | jq -r '.diff_refs.start_sha')

echo "Base: $base_sha"
echo "Head: $head_sha"
echo "Start: $start_sha"

Common Workflows

Workflow 1: Review MR with Comments
project_id=123
mr_iid=1

# Get diff refs
mr_info=$(glab api projects/$project_id/merge_requests/$mr_iid)
base_sha=$(echo "$mr_info" | jq -r '.diff_refs.base_sha')
head_sha=$(echo "$mr_info" | jq -r '.diff_refs.head_sha')
start_sha=$(echo "$mr_info" | jq -r '.diff_refs.start_sha')

# Add comment on line 42 of new file
glab api projects/$project_id/merge_requests/$mr_iid/discussions --method POST \
  -f body="Consider adding error handling here." \
  -f position[base_sha]="$base_sha" \
  -f position[head_sha]="$head_sha" \
  -f position[start_sha]="$start_sha" \
  -f position[position_type]="text" \
  -f position[new_path]="src/handler.py" \
  -f position[new_line]=42
Workflow 2: Resolve All Discussions
# Get all unresolved discussions
glab api projects/123/merge_requests/1/discussions --paginate | \
  jq -r '.[] | select(.notes[0].resolvable == true and .notes[0].resolved == false) | .id' | \
  while read discussion_id; do
    echo "Resolving: $discussion_id"
    glab api projects/123/merge_requests/1/discussions/$discussion_id --method PUT \
      -f resolved=true
  done
Workflow 3: List Unresolved Discussions
# Show unresolved discussions with content
glab api projects/123/merge_requests/1/discussions --paginate | \
  jq -r '.[] | select(.notes[0].resolvable == true and .notes[0].resolved == false) | "[\(.id)] \(.notes[0].author.username): \(.notes[0].body | split("\n")[0])"'
Workflow 4: Add Suggestion
project_id=123
mr_iid=1

mr_info=$(glab api projects/$project_id/merge_requests/$mr_iid)
base_sha=$(echo "$mr_info" | jq -r '.diff_refs.base_sha')
head_sha=$(echo "$mr_info" | jq -r '.diff_refs.head_sha')
start_sha=$(echo "$mr_info" | jq -r '.diff_refs.start_sha')

# Create suggestion (multi-line needs proper escaping)
glab api projects/$project_id/merge_requests/$mr_iid/discussions --method POST \
  -f body='```suggestion
const result = await fetchData();
return result.data;
```' \
  -f position[base_sha]="$base_sha" \
  -f position[head_sha]="$head_sha" \
  -f position[start_sha]="$start_sha" \
  -f position[position_type]="text" \
  -f position[new_path]="src/api.js" \
  -f position[new_line]=25
Workflow 5: Summarize Discussion Activity
# Count discussions by state
glab api projects/123/merge_requests/1/discussions --paginate | \
  jq '{
    total: length,
    resolved: [.[] | select(.notes[0].resolved == true)] | length,
    unresolved: [.[] | select(.notes[0].resolvable == true and .notes[0].resolved == false)] | length
  }'

Troubleshooting

IssueCauseSolution
400 Bad RequestMissing position fieldsInclude all required position fields
404 Discussion not foundInvalid discussion IDCheck discussion exists
Cannot resolveNot resolvable or not authorizedCheck note type and permissions
Position invalidWrong SHAs or line numbersGet fresh diff_refs from MR
Note emptyBody not setCheck -f body=... parameter

Discussion vs Note

  • Discussion: A thread that can have multiple notes/replies
  • Note: A single comment within a discussion
  • Resolvable: Discussions on MR diffs can be resolved/unresolved
  • System notes: Auto-generated (commits, status changes) - not editable

Related Documentation

Comments

Markdown supported