Skip to content

Commit 9eba997

Browse files
committed
Merge branch 'main' into docs/antigravity-guide
2 parents 4e3f8c0 + afe34d8 commit 9eba997

25 files changed

+1159
-295
lines changed

README.md

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -726,12 +726,12 @@ The following sets of tools are available:
726726
- **issue_read** - Get issue details
727727
- `issue_number`: The number of the issue (number, required)
728728
- `method`: The read operation to perform on a single issue.
729-
Options are:
730-
1. get - Get details of a specific issue.
731-
2. get_comments - Get issue comments.
732-
3. get_sub_issues - Get sub-issues of the issue.
733-
4. get_labels - Get labels assigned to the issue.
734-
(string, required)
729+
Options are:
730+
1. get - Get details of a specific issue.
731+
2. get_comments - Get issue comments.
732+
3. get_sub_issues - Get sub-issues of the issue.
733+
4. get_labels - Get labels assigned to the issue.
734+
(string, required)
735735
- `owner`: The owner of the repository (string, required)
736736
- `page`: Page number for pagination (min 1) (number, optional)
737737
- `perPage`: Results per page for pagination (min 1, max 100) (number, optional)
@@ -744,10 +744,10 @@ Options are:
744744
- `issue_number`: Issue number to update (number, optional)
745745
- `labels`: Labels to apply to this issue (string[], optional)
746746
- `method`: Write operation to perform on a single issue.
747-
Options are:
748-
- 'create' - creates a new issue.
749-
- 'update' - updates an existing issue.
750-
(string, required)
747+
Options are:
748+
- 'create' - creates a new issue.
749+
- 'update' - updates an existing issue.
750+
(string, required)
751751
- `milestone`: Milestone number (number, optional)
752752
- `owner`: Repository owner (string, required)
753753
- `repo`: Repository name (string, required)
@@ -784,11 +784,11 @@ Options are:
784784
- `before_id`: The ID of the sub-issue to be prioritized before (either after_id OR before_id should be specified) (number, optional)
785785
- `issue_number`: The number of the parent issue (number, required)
786786
- `method`: The action to perform on a single sub-issue
787-
Options are:
788-
- 'add' - add a sub-issue to a parent issue in a GitHub repository.
789-
- 'remove' - remove a sub-issue from a parent issue in a GitHub repository.
790-
- 'reprioritize' - change the order of sub-issues within a parent issue in a GitHub repository. Use either 'after_id' or 'before_id' to specify the new position.
791-
(string, required)
787+
Options are:
788+
- 'add' - add a sub-issue to a parent issue in a GitHub repository.
789+
- 'remove' - remove a sub-issue from a parent issue in a GitHub repository.
790+
- 'reprioritize' - change the order of sub-issues within a parent issue in a GitHub repository. Use either 'after_id' or 'before_id' to specify the new position.
791+
(string, required)
792792
- `owner`: Repository owner (string, required)
793793
- `replace_parent`: When true, replaces the sub-issue's current parent issue. Use with 'add' method only. (boolean, optional)
794794
- `repo`: Repository name (string, required)
@@ -986,15 +986,15 @@ Options are:
986986

987987
- **pull_request_read** - Get details for a single pull request
988988
- `method`: Action to specify what pull request data needs to be retrieved from GitHub.
989-
Possible options:
990-
1. get - Get details of a specific pull request.
991-
2. get_diff - Get the diff of a pull request.
992-
3. get_status - Get status of a head commit in a pull request. This reflects status of builds and checks.
993-
4. get_files - Get the list of files changed in a pull request. Use with pagination parameters to control the number of results returned.
994-
5. get_review_comments - Get the review comments on a pull request. They are comments made on a portion of the unified diff during a pull request review. Use with pagination parameters to control the number of results returned.
995-
6. get_reviews - Get the reviews on a pull request. When asked for review comments, use get_review_comments method.
996-
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.
997-
(string, required)
989+
Possible options:
990+
1. get - Get details of a specific pull request.
991+
2. get_diff - Get the diff of a pull request.
992+
3. get_status - Get status of a head commit in a pull request. This reflects status of builds and checks.
993+
4. get_files - Get the list of files changed in a pull request. Use with pagination parameters to control the number of results returned.
994+
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.
995+
6. get_reviews - Get the reviews on a pull request. When asked for review comments, use get_review_comments method.
996+
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.
997+
(string, required)
998998
- `owner`: Repository owner (string, required)
999999
- `page`: Page number for pagination (min 1) (number, optional)
10001000
- `perPage`: Results per page for pagination (min 1, max 100) (number, optional)
@@ -1061,7 +1061,7 @@ Possible options:
10611061
- `owner`: Repository owner (username or organization) (string, required)
10621062
- `path`: Path where to create/update the file (string, required)
10631063
- `repo`: Repository name (string, required)
1064-
- `sha`: Required if updating an existing file. The blob SHA of the file being replaced. (string, optional)
1064+
- `sha`: The blob SHA of the file being replaced. (string, optional)
10651065

10661066
- **create_repository** - Create repository
10671067
- `autoInit`: Initialize with README (boolean, optional)
@@ -1092,7 +1092,7 @@ Possible options:
10921092

10931093
- **get_file_contents** - Get file or directory contents
10941094
- `owner`: Repository owner (username or organization) (string, required)
1095-
- `path`: Path to file/directory (directories must end with a slash '/') (string, optional)
1095+
- `path`: Path to file/directory (string, optional)
10961096
- `ref`: Accepts optional git refs such as `refs/tags/{tag}`, `refs/heads/{branch}` or `refs/pull/{pr_number}/head` (string, optional)
10971097
- `repo`: Repository name (string, required)
10981098
- `sha`: Accepts optional commit SHA. If specified, it will be used instead of ref (string, optional)

cmd/github-mcp-server/generate_docs.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,9 @@ func generateToolDoc(tool mcp.Tool) string {
269269

270270
description = prop.Description
271271

272+
// Indent any continuation lines in the description to maintain markdown formatting
273+
description = indentMultilineDescription(description, " ")
274+
272275
paramLine := fmt.Sprintf(" - `%s`: %s (%s, %s)", propName, description, typeStr, requiredStr)
273276
lines = append(lines, paramLine)
274277
}
@@ -288,6 +291,19 @@ func contains(slice []string, item string) bool {
288291
return false
289292
}
290293

294+
// indentMultilineDescription adds the specified indent to all lines after the first line.
295+
// This ensures that multi-line descriptions maintain proper markdown list formatting.
296+
func indentMultilineDescription(description, indent string) string {
297+
lines := strings.Split(description, "\n")
298+
if len(lines) <= 1 {
299+
return description
300+
}
301+
for i := 1; i < len(lines); i++ {
302+
lines[i] = indent + lines[i]
303+
}
304+
return strings.Join(lines, "\n")
305+
}
306+
291307
func replaceSection(content, startMarker, endMarker, newContent string) string {
292308
startPattern := fmt.Sprintf(`<!-- %s -->`, regexp.QuoteMeta(startMarker))
293309
endPattern := fmt.Sprintf(`<!-- %s -->`, regexp.QuoteMeta(endMarker))

docs/remote-server.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Below is a table of available toolsets for the remote GitHub MCP Server. Each to
1919
<!-- START AUTOMATED TOOLSETS -->
2020
| Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) |
2121
|----------------|--------------------------------------------------|-------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
22-
| Default | ["Default" toolset](../README.md#default-toolset) | https://api.githubcopilot.com/mcp/ | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2F%22%7D) | [read-only](https://api.githubcopilot.com/mcp/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Freadonly%22%7D) |
22+
| all | All available GitHub MCP tools | https://api.githubcopilot.com/mcp/ | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2F%22%7D) | [read-only](https://api.githubcopilot.com/mcp/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Freadonly%22%7D) |
2323
| Actions | GitHub Actions workflows and CI/CD operations | https://api.githubcopilot.com/mcp/x/actions | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-actions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Factions%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/actions/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-actions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Factions%2Freadonly%22%7D) |
2424
| Code Security | Code security related tools, such as GitHub Code Scanning | https://api.githubcopilot.com/mcp/x/code_security | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-code_security&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcode_security%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/code_security/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-code_security&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcode_security%2Freadonly%22%7D) |
2525
| Dependabot | Dependabot tools | https://api.githubcopilot.com/mcp/x/dependabot | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-dependabot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdependabot%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/dependabot/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-dependabot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdependabot%2Freadonly%22%7D) |

internal/ghmcp/server.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,10 @@ func NewMCPServer(cfg MCPServerConfig) (*mcp.Server, error) {
100100

101101
enabledToolsets := cfg.EnabledToolsets
102102

103-
// If dynamic toolsets are enabled, remove "all" from the enabled toolsets
103+
// If dynamic toolsets are enabled, remove "all" and "default" from the enabled toolsets
104104
if cfg.DynamicToolsets {
105105
enabledToolsets = github.RemoveToolset(enabledToolsets, github.ToolsetMetadataAll.ID)
106+
enabledToolsets = github.RemoveToolset(enabledToolsets, github.ToolsetMetadataDefault.ID)
106107
}
107108

108109
// Clean up the passed toolsets
@@ -176,8 +177,8 @@ func NewMCPServer(cfg MCPServerConfig) (*mcp.Server, error) {
176177

177178
// Register specific tools if configured
178179
if len(cfg.EnabledTools) > 0 {
179-
// Clean and validate tool names
180180
enabledTools := github.CleanTools(cfg.EnabledTools)
181+
enabledTools, _ = tsg.ResolveToolAliases(enabledTools)
181182

182183
// Register the specified tools (additive to any toolsets already enabled)
183184
err = tsg.RegisterSpecificTools(ghServer, enabledTools, cfg.ReadOnly)

pkg/github/__toolsnaps__/create_or_update_file.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"annotations": {
33
"title": "Create or update file"
44
},
5-
"description": "Create or update a single file in a GitHub repository. If updating, you must provide the SHA of the file you want to update. Use this tool to create or update a file in a GitHub repository remotely; do not use it for local file operations.",
5+
"description": "Create or update a single file in a GitHub repository. \nIf updating, you should provide the SHA of the file you want to update. Use this tool to create or update a file in a GitHub repository remotely; do not use it for local file operations.\n\nIn order to obtain the SHA of original file version before updating, use the following git command:\ngit ls-tree HEAD \u003cpath to file\u003e\n\nIf the SHA is not provided, the tool will attempt to acquire it by fetching the current file contents from the repository, which may lead to rewriting latest committed changes if the file has changed since last retrieval.\n",
66
"inputSchema": {
77
"type": "object",
88
"required": [
@@ -40,7 +40,7 @@
4040
},
4141
"sha": {
4242
"type": "string",
43-
"description": "Required if updating an existing file. The blob SHA of the file being replaced."
43+
"description": "The blob SHA of the file being replaced."
4444
}
4545
}
4646
},

pkg/github/__toolsnaps__/get_file_contents.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
},
1818
"path": {
1919
"type": "string",
20-
"description": "Path to file/directory (directories must end with a slash '/')",
20+
"description": "Path to file/directory",
2121
"default": "/"
2222
},
2323
"ref": {

pkg/github/__toolsnaps__/get_me.snap

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
},
66
"description": "Get details of the authenticated GitHub user. Use this when a request is about the user's own profile for GitHub. Or when information is missing to build other tool calls.",
77
"inputSchema": {
8-
"type": "object"
8+
"type": "object",
9+
"properties": {}
910
},
1011
"name": "get_me"
1112
}

pkg/github/__toolsnaps__/pull_request_read.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"properties": {
1616
"method": {
1717
"type": "string",
18-
"description": "Action to specify what pull request data needs to be retrieved from GitHub. \nPossible options: \n 1. get - Get details of a specific pull request.\n 2. get_diff - Get the diff of a pull request.\n 3. get_status - Get status of a head commit in a pull request. This reflects status of builds and checks.\n 4. get_files - Get the list of files changed in a pull request. Use with pagination parameters to control the number of results returned.\n 5. get_review_comments - Get the review comments on a pull request. They are comments made on a portion of the unified diff during a pull request review. Use with pagination parameters to control the number of results returned.\n 6. get_reviews - Get the reviews on a pull request. When asked for review comments, use get_review_comments method.\n 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.\n",
18+
"description": "Action to specify what pull request data needs to be retrieved from GitHub. \nPossible options: \n 1. get - Get details of a specific pull request.\n 2. get_diff - Get the diff of a pull request.\n 3. get_status - Get status of a head commit in a pull request. This reflects status of builds and checks.\n 4. get_files - Get the list of files changed in a pull request. Use with pagination parameters to control the number of results returned.\n 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.\n 6. get_reviews - Get the reviews on a pull request. When asked for review comments, use get_review_comments method.\n 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.\n",
1919
"enum": [
2020
"get",
2121
"get_diff",

pkg/github/context_tools.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package github
22

33
import (
44
"context"
5+
"encoding/json"
56
"time"
67

78
ghErrors "github.com/github/github-mcp-server/pkg/errors"
@@ -43,9 +44,9 @@ func GetMe(getClient GetClientFn, t translations.TranslationHelperFunc) (mcp.Too
4344
Title: t("TOOL_GET_ME_USER_TITLE", "Get my user profile"),
4445
ReadOnlyHint: true,
4546
},
46-
InputSchema: &jsonschema.Schema{
47-
Type: "object",
48-
},
47+
// Use json.RawMessage to ensure "properties" is included even when empty.
48+
// OpenAI strict mode requires the properties field to be present.
49+
InputSchema: json.RawMessage(`{"type":"object","properties":{}}`),
4950
},
5051
mcp.ToolHandlerFor[map[string]any, any](func(ctx context.Context, _ *mcp.CallToolRequest, _ map[string]any) (*mcp.CallToolResult, any, error) {
5152
client, err := getClient(ctx)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// deprecated_tool_aliases.go
2+
package github
3+
4+
// DeprecatedToolAliases maps old tool names to their new canonical names.
5+
// When tools are renamed, add an entry here to maintain backward compatibility.
6+
// Users referencing the old name will receive the new tool with a deprecation warning.
7+
//
8+
// Example:
9+
//
10+
// "get_issue": "issue_read",
11+
// "create_pr": "pull_request_create",
12+
var DeprecatedToolAliases = map[string]string{
13+
// Add entries as tools are renamed
14+
}

0 commit comments

Comments
 (0)