Skip to content

Commit 273e45a

Browse files
authored
Merge branch 'main' into feat/resolve-review-threads
2 parents f0151e9 + b222072 commit 273e45a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+4272
-1865
lines changed

.github/prompts/bug-report-review.prompt.yml

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,38 @@ messages:
55
66
Your job is to analyze bug reports and assess their completeness.
77
8+
**CRITICAL: Detect unfilled templates**
9+
- Flag issues containing unmodified template text like "A clear and concise description of what the bug is"
10+
- Flag placeholder values like "Type this '...'" or "View the output '....'" that haven't been replaced
11+
- Flag generic/meaningless titles (e.g., random words, test content)
12+
- These are ALWAYS "Missing Details" even if the template structure is present
13+
814
Analyze the issue for these key elements:
9-
1. Clear description of the problem
15+
1. Clear description of the problem (not template text)
1016
2. Affected version (from running `docker run -i --rm ghcr.io/github/github-mcp-server ./github-mcp-server --version`)
11-
3. Steps to reproduce the behavior
12-
4. Expected vs actual behavior
17+
3. Steps to reproduce the behavior (actual steps, not placeholders)
18+
4. Expected vs actual behavior (real descriptions, not template text)
1319
5. Relevant logs (if applicable)
1420
1521
Provide ONE of these assessments:
1622
1723
### AI Assessment: Ready for Review
18-
Use when the bug report has most required information and can be triaged by a maintainer.
24+
Use when the bug report has actual information in required fields and can be triaged by a maintainer.
1925
2026
### AI Assessment: Missing Details
21-
Use when critical information is missing (no reproduction steps, no version info, unclear problem description).
27+
Use when:
28+
- Template text has not been replaced with actual content
29+
- Critical information is missing (no reproduction steps, no version info, unclear problem description)
30+
- The title is meaningless or spam-like
31+
- Placeholder text remains in any section
32+
33+
When marking as Missing Details, recommend adding the "waiting-for-reply" label.
2234
2335
### AI Assessment: Unsure
2436
Use when you cannot determine the completeness of the report.
2537
2638
After your assessment header, provide a brief explanation of your rating.
27-
If details are missing, note which specific sections need more information.
39+
If details are missing, be specific about which sections contain template text or need actual information.
2840
- role: user
2941
content: "{{input}}"
3042
model: openai/gpt-4o-mini

.github/prompts/default-issue-review.prompt.yml

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,47 @@ messages:
55
66
Your job is to analyze new issues and help categorize them.
77
8+
**CRITICAL: Detect invalid or incomplete submissions**
9+
- Flag issues with unmodified template text (e.g., "A clear and concise description...")
10+
- Flag placeholder values that haven't been replaced (e.g., "Type this '...'", "....", "XXX")
11+
- Flag meaningless, spam-like, or test titles (e.g., random words, nonsensical content)
12+
- Flag empty or nearly empty issues
13+
- These are ALWAYS "Missing Details" or "Invalid" depending on severity
14+
815
Analyze the issue to determine:
9-
1. Is this a bug report, feature request, question, or something else?
10-
2. Is the issue clear and well-described?
16+
1. Is this a bug report, feature request, question, documentation issue, or something else?
17+
2. Is the issue clear and well-described with actual content (not template text)?
1118
3. Does it contain enough information for maintainers to act on?
19+
4. Is this potentially spam, a test issue, or completely invalid?
1220
1321
Provide ONE of these assessments:
1422
1523
### AI Assessment: Ready for Review
16-
Use when the issue is clear, well-described, and contains enough context for maintainers to understand and act on it.
24+
Use when the issue is clear, well-described with actual content, and contains enough context for maintainers to understand and act on it.
1725
1826
### AI Assessment: Missing Details
19-
Use when the issue is unclear, lacks context, or needs more information to be actionable.
27+
Use when:
28+
- Template text has not been replaced with actual content
29+
- The issue is unclear or lacks context
30+
- Critical information is missing to make it actionable
31+
- The title is vague but the issue seems legitimate
32+
33+
When marking as Missing Details, recommend adding the "waiting-for-reply" label.
34+
35+
### AI Assessment: Invalid
36+
Use when:
37+
- The issue appears to be spam or test content
38+
- The title is completely meaningless and body has no useful information
39+
- This doesn't relate to the GitHub MCP Server project at all
40+
41+
When marking as Invalid, recommend adding the "invalid" label and consider closing.
2042
2143
### AI Assessment: Unsure
2244
Use when you cannot determine the nature or completeness of the issue.
2345
2446
After your assessment header, provide a brief explanation including:
25-
- What type of issue this appears to be (bug, feature request, question, etc.)
47+
- What type of issue this appears to be (bug, feature request, question, invalid, etc.)
48+
- Which specific sections contain template text or need actual information
2649
- What additional information might be helpful if any
2750
- role: user
2851
content: "{{input}}"

Dockerfile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM node:20-alpine AS ui-build
1+
FROM node:20-alpine@sha256:09e2b3d9726018aecf269bd35325f46bf75046a643a66d28360ec71132750ec8 AS ui-build
22
WORKDIR /app
33
COPY ui/package*.json ./ui/
44
RUN cd ui && npm ci
@@ -7,7 +7,7 @@ COPY ui/ ./ui/
77
RUN mkdir -p ./pkg/github/ui_dist && \
88
cd ui && npm run build
99

10-
FROM golang:1.25.7-alpine AS build
10+
FROM golang:1.25.7-alpine@sha256:f6751d823c26342f9506c03797d2527668d095b0a15f1862cddb4d927a7a4ced AS build
1111
ARG VERSION="dev"
1212

1313
# Set the working directory
@@ -30,7 +30,7 @@ RUN --mount=type=cache,target=/go/pkg/mod \
3030
-o /bin/github-mcp-server ./cmd/github-mcp-server
3131

3232
# Make a stage to run the app
33-
FROM gcr.io/distroless/base-debian12
33+
FROM gcr.io/distroless/base-debian12@sha256:937c7eaaf6f3f2d38a1f8c4aeff326f0c56e4593ea152e9e8f74d976dde52f56
3434

3535
# Add required MCP server annotation
3636
LABEL io.modelcontextprotocol.server.name="io.github.github/github-mcp-server"

README.md

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ When no toolsets are specified, [default toolsets](#default-toolset) are used.
140140
</tr>
141141
</table>
142142

143-
See [Remote Server Documentation](docs/remote-server.md#insiders-mode) for more details and examples.
143+
See [Remote Server Documentation](docs/remote-server.md#insiders-mode) for more details and examples, and [Insiders Features](docs/insiders-features.md) for a full list of what's available.
144144

145145
#### GitHub Enterprise
146146

@@ -153,7 +153,7 @@ Example for `https://octocorp.ghe.com` with GitHub PAT token:
153153
```
154154
{
155155
...
156-
"proxima-github": {
156+
"github-octocorp": {
157157
"type": "http",
158158
"url": "https://copilot-api.octocorp.ghe.com/mcp",
159159
"headers": {
@@ -560,6 +560,7 @@ The following sets of tools are available:
560560
| <picture><source media="(prefers-color-scheme: dark)" srcset="pkg/octicons/icons/person-dark.png"><source media="(prefers-color-scheme: light)" srcset="pkg/octicons/icons/person-light.png"><img src="pkg/octicons/icons/person-light.png" width="20" height="20" alt="person"></picture> | `context` | **Strongly recommended**: Tools that provide context about the current user and GitHub context you are operating in |
561561
| <picture><source media="(prefers-color-scheme: dark)" srcset="pkg/octicons/icons/workflow-dark.png"><source media="(prefers-color-scheme: light)" srcset="pkg/octicons/icons/workflow-light.png"><img src="pkg/octicons/icons/workflow-light.png" width="20" height="20" alt="workflow"></picture> | `actions` | GitHub Actions workflows and CI/CD operations |
562562
| <picture><source media="(prefers-color-scheme: dark)" srcset="pkg/octicons/icons/codescan-dark.png"><source media="(prefers-color-scheme: light)" srcset="pkg/octicons/icons/codescan-light.png"><img src="pkg/octicons/icons/codescan-light.png" width="20" height="20" alt="codescan"></picture> | `code_security` | Code security related tools, such as GitHub Code Scanning |
563+
| <picture><source media="(prefers-color-scheme: dark)" srcset="pkg/octicons/icons/copilot-dark.png"><source media="(prefers-color-scheme: light)" srcset="pkg/octicons/icons/copilot-light.png"><img src="pkg/octicons/icons/copilot-light.png" width="20" height="20" alt="copilot"></picture> | `copilot` | Copilot related tools |
563564
| <picture><source media="(prefers-color-scheme: dark)" srcset="pkg/octicons/icons/dependabot-dark.png"><source media="(prefers-color-scheme: light)" srcset="pkg/octicons/icons/dependabot-light.png"><img src="pkg/octicons/icons/dependabot-light.png" width="20" height="20" alt="dependabot"></picture> | `dependabot` | Dependabot tools |
564565
| <picture><source media="(prefers-color-scheme: dark)" srcset="pkg/octicons/icons/comment-discussion-dark.png"><source media="(prefers-color-scheme: light)" srcset="pkg/octicons/icons/comment-discussion-light.png"><img src="pkg/octicons/icons/comment-discussion-light.png" width="20" height="20" alt="comment-discussion"></picture> | `discussions` | GitHub Discussions related tools |
565566
| <picture><source media="(prefers-color-scheme: dark)" srcset="pkg/octicons/icons/logo-gist-dark.png"><source media="(prefers-color-scheme: light)" srcset="pkg/octicons/icons/logo-gist-light.png"><img src="pkg/octicons/icons/logo-gist-light.png" width="20" height="20" alt="logo-gist"></picture> | `gists` | GitHub Gist related tools |
@@ -686,6 +687,26 @@ The following sets of tools are available:
686687

687688
<details>
688689

690+
<summary><picture><source media="(prefers-color-scheme: dark)" srcset="pkg/octicons/icons/copilot-dark.png"><source media="(prefers-color-scheme: light)" srcset="pkg/octicons/icons/copilot-light.png"><img src="pkg/octicons/icons/copilot-light.png" width="20" height="20" alt="copilot"></picture> Copilot</summary>
691+
692+
- **assign_copilot_to_issue** - Assign Copilot to issue
693+
- **Required OAuth Scopes**: `repo`
694+
- `base_ref`: Git reference (e.g., branch) that the agent will start its work from. If not specified, defaults to the repository's default branch (string, optional)
695+
- `custom_instructions`: Optional custom instructions to guide the agent beyond the issue body. Use this to provide additional context, constraints, or guidance that is not captured in the issue description (string, optional)
696+
- `issue_number`: Issue number (number, required)
697+
- `owner`: Repository owner (string, required)
698+
- `repo`: Repository name (string, required)
699+
700+
- **request_copilot_review** - Request Copilot review
701+
- **Required OAuth Scopes**: `repo`
702+
- `owner`: Repository owner (string, required)
703+
- `pullNumber`: Pull request number (number, required)
704+
- `repo`: Repository name (string, required)
705+
706+
</details>
707+
708+
<details>
709+
689710
<summary><picture><source media="(prefers-color-scheme: dark)" srcset="pkg/octicons/icons/dependabot-dark.png"><source media="(prefers-color-scheme: light)" srcset="pkg/octicons/icons/dependabot-light.png"><img src="pkg/octicons/icons/dependabot-light.png" width="20" height="20" alt="dependabot"></picture> Dependabot</summary>
690711

691712
- **get_dependabot_alert** - Get dependabot alert
@@ -794,14 +815,6 @@ The following sets of tools are available:
794815
- `owner`: Repository owner (string, required)
795816
- `repo`: Repository name (string, required)
796817

797-
- **assign_copilot_to_issue** - Assign Copilot to issue
798-
- **Required OAuth Scopes**: `repo`
799-
- `base_ref`: Git reference (e.g., branch) that the agent will start its work from. If not specified, defaults to the repository's default branch (string, optional)
800-
- `custom_instructions`: Optional custom instructions to guide the agent beyond the issue body. Use this to provide additional context, constraints, or guidance that is not captured in the issue description (string, optional)
801-
- `issue_number`: Issue number (number, required)
802-
- `owner`: Repository owner (string, required)
803-
- `repo`: Repository name (string, required)
804-
805818
- **get_label** - Get a specific label from a repository.
806819
- **Required OAuth Scopes**: `repo`
807820
- `name`: Label name. (string, required)
@@ -983,9 +996,10 @@ The following sets of tools are available:
983996
- `fields`: Specific list of field IDs to include in the response when getting a project item (e.g. ["102589", "985201", "169875"]). If not provided, only the title field is included. Only used for 'get_project_item' method. (string[], optional)
984997
- `item_id`: The item's ID. Required for 'get_project_item' method. (number, optional)
985998
- `method`: The method to execute (string, required)
986-
- `owner`: The owner (user or organization login). The name is not case sensitive. (string, required)
999+
- `owner`: The owner (user or organization login). The name is not case sensitive. (string, optional)
9871000
- `owner_type`: Owner type (user or org). If not provided, will be automatically detected. (string, optional)
988-
- `project_number`: The project's number. (number, required)
1001+
- `project_number`: The project's number. (number, optional)
1002+
- `status_update_id`: The node ID of the project status update. Required for 'get_project_status_update' method. (string, optional)
9891003

9901004
- **projects_list** - List GitHub Projects resources
9911005
- **Required OAuth Scopes**: `read:project`
@@ -997,11 +1011,12 @@ The following sets of tools are available:
9971011
- `owner`: The owner (user or organization login). The name is not case sensitive. (string, required)
9981012
- `owner_type`: Owner type (user or org). If not provided, will automatically try both. (string, optional)
9991013
- `per_page`: Results per page (max 50) (number, optional)
1000-
- `project_number`: The project's number. Required for 'list_project_fields' and 'list_project_items' methods. (number, optional)
1014+
- `project_number`: The project's number. Required for 'list_project_fields', 'list_project_items', and 'list_project_status_updates' methods. (number, optional)
10011015
- `query`: Filter/query string. For list_projects: filter by title text and state (e.g. "roadmap is:open"). For list_project_items: advanced filtering using GitHub's project filtering syntax. (string, optional)
10021016

10031017
- **projects_write** - Modify GitHub Project items
10041018
- **Required OAuth Scopes**: `project`
1019+
- `body`: The body of the status update (markdown). Used for 'create_project_status_update' method. (string, optional)
10051020
- `issue_number`: The issue number (use when item_type is 'issue' for 'add_project_item' method). Provide either issue_number or pull_request_number. (number, optional)
10061021
- `item_id`: The project item ID. Required for 'update_project_item' and 'delete_project_item' methods. (number, optional)
10071022
- `item_owner`: The owner (user or organization) of the repository containing the issue or pull request. Required for 'add_project_item' method. (string, optional)
@@ -1012,6 +1027,9 @@ The following sets of tools are available:
10121027
- `owner_type`: Owner type (user or org). If not provided, will be automatically detected. (string, optional)
10131028
- `project_number`: The project's number. (number, required)
10141029
- `pull_request_number`: The pull request number (use when item_type is 'pull_request' for 'add_project_item' method). Provide either issue_number or pull_request_number. (number, optional)
1030+
- `start_date`: The start date of the status update in YYYY-MM-DD format. Used for 'create_project_status_update' method. (string, optional)
1031+
- `status`: The status of the project. Used for 'create_project_status_update' method. (string, optional)
1032+
- `target_date`: The target date of the status update in YYYY-MM-DD format. Used for 'create_project_status_update' method. (string, optional)
10151033
- `updated_field`: Object consisting of the ID of the project field to update and the new value for the field. To clear the field, set value to null. Example: {"id": 123456, "value": "New Value"}. Required for 'update_project_item' method. (object, optional)
10161034

10171035
</details>
@@ -1079,11 +1097,12 @@ The following sets of tools are available:
10791097
Possible options:
10801098
1. get - Get details of a specific pull request.
10811099
2. get_diff - Get the diff of a pull request.
1082-
3. get_status - Get status of a head commit in a pull request. This reflects status of builds and checks.
1100+
3. get_status - Get combined commit status of a head commit in a pull request.
10831101
4. get_files - Get the list of files changed in a pull request. Use with pagination parameters to control the number of results returned.
10841102
5. get_review_comments - Get review threads on a pull request. Each thread contains logically grouped review comments made on the same code location during pull request reviews. Returns threads with metadata (isResolved, isOutdated, isCollapsed) and their associated comments. Use cursor-based pagination (perPage, after) to control results.
10851103
6. get_reviews - Get the reviews on a pull request. When asked for review comments, use get_review_comments method.
10861104
7. get_comments - Get comments on a pull request. Use this if user doesn't specifically want review comments. Use with pagination parameters to control the number of results returned.
1105+
8. get_check_runs - Get check runs for the head commit of a pull request. Check runs are the individual CI/CD jobs and checks that run on the PR.
10871106
(string, required)
10881107
- `owner`: Repository owner (string, required)
10891108
- `page`: Page number for pagination (min 1) (number, optional)
@@ -1102,12 +1121,6 @@ The following sets of tools are available:
11021121
- `repo`: Repository name (string, required)
11031122
- `threadId`: The node ID of the review thread (e.g., PRRT_kwDOxxx). Required for resolve_thread and unresolve_thread methods. Get thread IDs from pull_request_read with method get_review_comments. (string, optional)
11041123

1105-
- **request_copilot_review** - Request Copilot review
1106-
- **Required OAuth Scopes**: `repo`
1107-
- `owner`: Repository owner (string, required)
1108-
- `pullNumber`: Pull request number (number, required)
1109-
- `repo`: Repository name (string, required)
1110-
11111124
- **search_pull_requests** - Search pull requests
11121125
- **Required OAuth Scopes**: `repo`
11131126
- `order`: Sort order (string, optional)

cmd/github-mcp-server/main.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ var (
6161
}
6262
}
6363

64+
// Parse excluded tools (similar to tools)
65+
var excludeTools []string
66+
if viper.IsSet("exclude_tools") {
67+
if err := viper.UnmarshalKey("exclude_tools", &excludeTools); err != nil {
68+
return fmt.Errorf("failed to unmarshal exclude-tools: %w", err)
69+
}
70+
}
71+
6472
// Parse enabled features (similar to toolsets)
6573
var enabledFeatures []string
6674
if viper.IsSet("features") {
@@ -85,6 +93,7 @@ var (
8593
ContentWindowSize: viper.GetInt("content-window-size"),
8694
LockdownMode: viper.GetBool("lockdown-mode"),
8795
InsidersMode: viper.GetBool("insiders"),
96+
ExcludeTools: excludeTools,
8897
RepoAccessCacheTTL: &ttl,
8998
}
9099
return ghmcp.RunStdioServer(stdioServerConfig)
@@ -126,6 +135,7 @@ func init() {
126135
// Add global flags that will be shared by all commands
127136
rootCmd.PersistentFlags().StringSlice("toolsets", nil, github.GenerateToolsetsHelp())
128137
rootCmd.PersistentFlags().StringSlice("tools", nil, "Comma-separated list of specific tools to enable")
138+
rootCmd.PersistentFlags().StringSlice("exclude-tools", nil, "Comma-separated list of tool names to disable regardless of other settings")
129139
rootCmd.PersistentFlags().StringSlice("features", nil, "Comma-separated list of feature flags to enable")
130140
rootCmd.PersistentFlags().Bool("dynamic-toolsets", false, "Enable dynamic toolsets")
131141
rootCmd.PersistentFlags().Bool("read-only", false, "Restrict the server to read-only operations")
@@ -147,6 +157,7 @@ func init() {
147157
// Bind flag to viper
148158
_ = viper.BindPFlag("toolsets", rootCmd.PersistentFlags().Lookup("toolsets"))
149159
_ = viper.BindPFlag("tools", rootCmd.PersistentFlags().Lookup("tools"))
160+
_ = viper.BindPFlag("exclude_tools", rootCmd.PersistentFlags().Lookup("exclude-tools"))
150161
_ = viper.BindPFlag("features", rootCmd.PersistentFlags().Lookup("features"))
151162
_ = viper.BindPFlag("dynamic_toolsets", rootCmd.PersistentFlags().Lookup("dynamic-toolsets"))
152163
_ = viper.BindPFlag("read-only", rootCmd.PersistentFlags().Lookup("read-only"))

0 commit comments

Comments
 (0)