Comprehensive guide for working with GitHub data and APIs. Use when fetching issues, PRs, discussions, comments, reviews, or any GitHub content. Covers tool selection (mcp_github vs fetch vs semantic search), complete conversation fetching patterns, pagination handling, and common workflows. Critical for avoiding standard API failures when fetching comments/reviews—MCP tools required.
Scanned 2/12/2026
Install via CLI
openskills install majiayu000/claude-skill-registry---
name: github-interaction
description: Comprehensive guide for working with GitHub data and APIs. Use when fetching issues, PRs, discussions, comments, reviews, or any GitHub content. Covers tool selection (mcp_github vs fetch vs semantic search), complete conversation fetching patterns, pagination handling, and common workflows. Critical for avoiding standard API failures when fetching comments/reviews—MCP tools required.
---
# GitHub Interaction
Guide for effective GitHub data retrieval covering tool selection, complete conversation fetching, and common patterns.
## Critical Rule: MCP Tools for Comments and Reviews
**ALWAYS use GitHub MCP tools (`mcp_github_*`) to fetch PR/issue comments and reviews. Standard API access will fail.**
This is the most common mistake. When you need comments, reviews, or discussion threads, you MUST use the MCP tools.
## Tool Selection Decision Tree
### When to use `mcp_github_*` tools
Use for ALL GitHub data operations:
- ✅ Fetching issues, PRs, discussions (individual or lists)
- ✅ **Getting comments** (issue comments, PR review comments, discussion comments)
- ✅ **Getting reviews** (PR reviews and review threads)
- ✅ Getting file contents from repos
- ✅ Creating/updating issues, PRs, comments
- ✅ Searching issues, PRs, code, repositories, users
- ✅ Managing branches, commits, assignees, labels
**Examples**:
```
mcp_github_issue_read (method: get, get_comments, get_sub_issues, get_labels)
mcp_github_pull_request_read (method: get, get_diff, get_files, get_review_comments, get_reviews, get_comments)
mcp_github_get_discussion + mcp_github_get_discussion_comments
mcp_github_search_issues, mcp_github_search_pull_requests, mcp_github_search_code
mcp_github_get_file_contents
```
### When to use `fetch_webpage`
Use ONLY for external web content:
- ✅ Public documentation sites
- ✅ Blog posts, articles (not on GitHub)
- ✅ External APIs or services
- ❌ NEVER for GitHub issues/PRs/discussions/comments
### When to use `github_repo` semantic search
Use for finding code patterns across GitHub repositories:
- ✅ Searching for function/class implementations across repos
- ✅ Finding usage examples in codebases
- ✅ Discovering patterns in specific GitHub repo source code
- ❌ Not for issues/PRs/discussions (use `mcp_github_search_*` instead)
### When to use `grep_search` / `semantic_search`
Use for LOCAL workspace files only:
- ✅ Searching files in current VS Code workspace
- ✅ Finding patterns in brain repository notes
- ✅ Locating local code or documentation
- ❌ NEVER for GitHub remote content
## Complete Conversation Fetching Patterns
### Fetching a Full Issue
**Pattern**: Get issue + get all comments
```
1. mcp_github_issue_read (method: get, issue_number: X)
→ Returns issue details (title, body, state, assignees, labels, etc.)
2. mcp_github_issue_read (method: get_comments, issue_number: X, perPage: 100)
→ Returns all comments with author, timestamp, body
→ Use pagination if > 100 comments (page parameter)
```
**What you get**: Complete issue thread including description and all discussion
### Fetching a Full Pull Request
**Pattern**: Get PR + diff + files + review comments + reviews + general comments
```
1. mcp_github_pull_request_read (method: get, pullNumber: X)
→ Returns PR metadata (title, body, state, base/head, mergeable, etc.)
2. mcp_github_pull_request_read (method: get_diff, pullNumber: X)
→ Returns unified diff of all changes
3. mcp_github_pull_request_read (method: get_files, pullNumber: X, perPage: 100)
→ Returns list of changed files with stats
→ Paginate if many files changed
4. mcp_github_pull_request_read (method: get_review_comments, pullNumber: X, perPage: 100)
→ Returns review threads (line-specific comments grouped by thread)
→ Each thread has metadata: isResolved, isOutdated, isCollapsed
→ Use cursor-based pagination (after parameter) if needed
5. mcp_github_pull_request_read (method: get_reviews, pullNumber: X, perPage: 100)
→ Returns formal reviews (APPROVE, REQUEST_CHANGES, COMMENT)
→ Includes review body and state
6. mcp_github_pull_request_read (method: get_comments, pullNumber: X, perPage: 100)
→ Returns general PR comments (not line-specific)
→ These are issue-style comments on the PR conversation
```
**What you get**: Complete PR context including code changes, all review feedback, and discussion
**Important distinctions**:
- `get_review_comments`: Line-specific code review threads
- `get_reviews`: Formal review submissions (approve/request changes)
- `get_comments`: General conversation comments (not tied to code lines)
### Fetching a Full Discussion
**Pattern**: Get discussion + get all comments with pagination
```
1. mcp_github_get_discussion (owner: X, repo: Y, discussionNumber: Z)
→ Returns discussion details (title, body, category, state)
2. mcp_github_get_discussion_comments (owner: X, repo: Y, discussionNumber: Z, perPage: 100)
→ Returns nested comment threads
→ Use cursor-based pagination (after: endCursor from previous response)
→ Each comment includes replies (nested threads)
```
**What you get**: Complete discussion with all threaded replies
**Pagination note**: Discussions use GraphQL cursor-based pagination. Check `pageInfo.hasNextPage` and use `pageInfo.endCursor` in `after` parameter.
## Common Patterns and Workflows
### Searching for PRs/Issues with Filters
**Date filtering**:
```
mcp_github_search_pull_requests
query: "author:jonmagic created:2025-11-01..2025-11-30"
mcp_github_search_issues
query: "involves:jonmagic updated:>=2025-11-01"
```
**State filtering**:
```
# Merged PRs only
query: "is:merged author:jonmagic repo:github/github"
# Open issues assigned to you
query: "is:open assignee:jonmagic"
# Closed issues in date range
query: "is:closed closed:2025-11-01..2025-11-30"
```
**Combining filters**:
```
query: "is:pr is:merged author:jonmagic repo:github/hamzo created:2025-11-01..2025-11-30"
```
### Fetching Multiple Items Efficiently
**Batch pattern** (for small lists):
```
1. Search for items: mcp_github_search_pull_requests
2. For each result (up to 5-10), fetch details in parallel:
- mcp_github_pull_request_read (method: get, pullNumber: N)
```
**Avoid**: Fetching full details for 50+ items at once. Instead, ask user which specific items to deep-dive.
### Creating PRs with Proper Formatting
```
mcp_github_create_pull_request
title: "Clear, specific title"
body: "## Summary\n\n...\n\n## Changes\n\n- Item 1\n- Item 2"
head: "feature-branch-name"
base: "main"
draft: false (or true for work-in-progress)
```
**Body formatting tips**:
- Use Markdown (headings, lists, code blocks)
- Reference issues: `Closes #123` or `Relates to #456`
- Include context for reviewers
- Add testing notes or screenshots if relevant
### Adding Comments vs Reviews
**Issue comment** (general discussion):
```
mcp_github_add_issue_comment
issue_number: X
body: "Your comment text"
```
**PR review** (formal approval/changes requested):
```
1. Create pending review:
mcp_github_pull_request_review_write (method: create)
body: "Overall feedback"
event: null (omit to create pending)
2. Submit review:
mcp_github_pull_request_review_write (method: submit_pending)
body: "Final summary"
event: "APPROVE" | "REQUEST_CHANGES" | "COMMENT"
```
## Pagination Best Practices
### REST-based Pagination (page/perPage)
Used by: `list_issues`, `list_pull_requests`, `get_comments`, `get_files`, `get_reviews`
```
perPage: 100 (max)
page: 1, 2, 3, ... (1-based)
```
**Pattern**:
```
1. First call: perPage: 100, page: 1
2. If results.length === 100, likely more pages
3. Next call: perPage: 100, page: 2
4. Repeat until results.length < 100
```
### GraphQL Cursor Pagination (after/endCursor)
Used by: `list_issues` (GraphQL mode), `get_discussion_comments`, `get_review_comments`
```
perPage: 100
after: "cursor-string-from-previous-response"
```
**Pattern**:
```
1. First call: perPage: 100 (no after)
2. Check response.pageInfo.hasNextPage
3. If true, next call: perPage: 100, after: response.pageInfo.endCursor
4. Repeat until hasNextPage === false
```
## Common Mistakes to Avoid
❌ **Using `fetch_webpage` for GitHub issues/PRs**
- Standard web scraping doesn't work for GitHub content
- Always use MCP tools
❌ **Forgetting pagination**
- Default limits are often 30 items
- Set `perPage: 100` to reduce round trips
- Check for more pages before concluding
❌ **Mixing up comment types**
- Issue comments ≠ PR review comments ≠ PR general comments
- Use correct method for each type
❌ **Not filtering by date range**
- Fetching all historical data when you only need recent work
- Use `created:`, `updated:`, `merged:` filters
❌ **Ignoring PR state when searching for completed work**
- Open PRs should go to "Ideas" section in snippets
- Only merged/closed PRs belong in "Ships"
- Use `is:merged` or `is:closed` filters
## Quick Reference: Method Cheat Sheet
### Issues
- Get issue: `issue_read (method: get)`
- Get comments: `issue_read (method: get_comments)`
- Get sub-issues: `issue_read (method: get_sub_issues)`
- Create/update: `issue_write (method: create | update)`
- Search: `search_issues`
### Pull Requests
- Get PR: `pull_request_read (method: get)`
- Get diff: `pull_request_read (method: get_diff)`
- Get files: `pull_request_read (method: get_files)`
- Get review comments: `pull_request_read (method: get_review_comments)`
- Get reviews: `pull_request_read (method: get_reviews)`
- Get general comments: `pull_request_read (method: get_comments)`
- Create PR: `create_pull_request`
- Update PR: `update_pull_request`
- Search: `search_pull_requests`
### Discussions
- Get discussion: `get_discussion`
- Get comments: `get_discussion_comments`
- List: `list_discussions`
### Other
- Search code: `search_code`
- Search repos: `search_repositories`
- Get file: `get_file_contents`
- List branches: `list_branches`
- Get commit: `get_commit`
No comments yet. Be the first to comment!