# gh_pullfrog MCP Tools

this directory contains the mcp (model context protocol) server tools for interacting with github.

## available tools

### check suite tools

#### `get_check_suite_logs`
get workflow run logs for a failed check suite with intelligent log analysis.

**parameters:**
- `check_suite_id` (number): the id from check_suite.id in the webhook payload

**replaces:** `gh run list` and `gh run view --log`

**returns:**
structured failure information for each failed job:
- `_instructions`: explains how to use each field
- `failed_jobs[]`: array of failed job results, each containing:
  - `job_id`, `job_name`, `job_url`: job identification
  - `failed_steps`: which CI steps failed (e.g., "Step 6: Run tests")
  - `log_index`: array of interesting lines (errors, warnings, failures) with line numbers
  - `excerpt`: ~80 line curated window around the last error
  - `full_log_path`: path to complete log file for deeper investigation

**log_index types:**
- `error`: lines matching `##[error]`, `Error:`, `ERR_`, `exit code N`
- `warning`: lines matching `##[warning]`, `WARN`
- `failure`: lines matching `N failed`, `FAIL`, `✕`
- `trace`: stack trace lines (deduplicated)

**workflow for using results:**
1. scan `log_index` to see where errors/warnings/failures are located in the log
2. read `excerpt` for immediate context around the main error
3. if excerpt doesn't show what you need, read specific line ranges from `full_log_path`
4. check `failed_steps` and read the workflow yml to understand what command failed

**example:**
```typescript
// when handling a check_suite_completed webhook
const result = await mcp.call("gh_pullfrog/get_check_suite_logs", {
  check_suite_id: check_suite.id
});

// result.failed_jobs[0].log_index shows:
// [
//   { line: 181, content: "WARN  Failed to create bin...", type: "warning" },
//   { line: 1079, content: "Error: expect(received).toBe(expected)", type: "error" },
//   ...
// ]
// use these line numbers to read specific sections from full_log_path
```

### review tools

#### `get_review_comments`
get all line-by-line comments for a specific pull request review, including full thread context for replies.

**parameters:**
- `pull_number` (number): the pull request number
- `review_id` (number): the id from review.id in the webhook payload
- `approved_by` (string, optional): only return comments this user gave a 👍 to

**replaces:** `gh api repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments`

**returns:**
- `commentsPath`: path to XML file with full comment details
- `reviewer`: github username of the review author
- `count`: number of comments to address

**output format (XML):**
```xml
<review_comments count="2" reviewer="colinmcd94">

<summary>
  <comment id="67890" file="src/utils/auth.ts" line="42">Actually, can you use a type guard...</comment>
  <comment id="67891" file="src/api/handler.ts" line="15">This should handle the error case</comment>
</summary>

<comment id="67890" file="src/utils/auth.ts" line="42" author="colinmcd94">
  <thread>
    <message id="12345" author="colinmcd94">Please add null checking here</message>
    <message id="23456" author="octocat">What about using optional chaining?</message>
  </thread>
  <diff>
@@ -40,7 +40,7 @@
   const user = getUser(id);
-  return user.name;
+  return user?.name;
  </diff>
  <body>Actually, can you use a type guard instead?</body>
</comment>

</review_comments>
```

- `<summary>` lists all comments to address with truncated preview
- `<thread>` shows parent comments (when replying to existing thread)
- `<diff>` contains the diff hunk around the commented line
- `<body>` is the actual comment text to address

**example:**
```typescript
// when handling a pull_request_review_submitted webhook
await mcp.call("gh_pullfrog/get_review_comments", {
  pull_number: 47,
  review_id: review.id
});
```

#### `list_pull_request_reviews`
list all reviews for a pull request.

**parameters:**
- `pull_number` (number): the pull request number

**replaces:** `gh api repos/{owner}/{repo}/pulls/{pull_number}/reviews`

**returns:**
array of reviews with:
- review id, body, state (approved/changes_requested/commented)
- user, commit_id, submitted_at, html_url

**example:**
```typescript
await mcp.call("gh_pullfrog/list_pull_request_reviews", {
  pull_number: 47
});
```

#### `reply_to_review_comment`
reply to a PR review comment thread explaining how the feedback was addressed.

**parameters:**
- `pull_number` (number): the pull request number
- `comment_id` (number): the ID of the review comment to reply to
- `body` (string): the reply text explaining how the feedback was addressed

**replaces:** `gh api repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies`

**returns:**
the created reply comment including:
- comment id, body, html_url
- in_reply_to_id showing it's a reply to the specified comment

**example:**
```typescript
// after addressing a review comment
await mcp.call("gh_pullfrog/reply_to_review_comment", {
  pull_number: 47,
  comment_id: 2567334961,
  body: "removed the function as requested"
});
```

### output tools

#### `set_output`
set the action output for consumption by subsequent workflow steps. useful when pullfrog is used as a step in a user-defined CI workflow (e.g., generating release notes).

**parameters:**
- `value` (string): the output value to expose

**returns:**
- `success`: true on success

the value will be available as the `result` output of the action, accessible via `${{ steps.<step-id>.outputs.result }}`.

**example:**
```typescript
// when generating content for downstream consumption
await mcp.call("gh_pullfrog/set_output", {
  value: "## Release Notes\n\n- Added new feature X\n- Fixed bug Y"
});
```

**usage in workflow:**
```yaml
- uses: pullfrog/pullfrog@v1
  id: notes
  with:
    prompt: "Generate release notes for v2.0.0"

- uses: softprops/action-gh-release@v1
  with:
    body: ${{ steps.notes.outputs.result }}
```

### other tools

see individual files for documentation on other tools:
- `comment.ts` - create, edit, and update comments
- `issue.ts` - create issues
- `output.ts` - set action output for workflow consumption
- `pr.ts` - create pull requests
- `prInfo.ts` - get pull request information
- `review.ts` - create pull request reviews
- `delegate.ts` - delegate task to a subagent with a specific mode and effort level

## usage in agents

agents should prefer using the mcp tools provided by this server. the `gh` cli is available as a fallback if needed, but mcp tools handle authentication and provide better integration.

the agent instructions automatically include guidance on using these tools.

