From 78f153acc4d12b5d8def5bcce47ded3df15a6d02 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Thu, 20 Mar 2025 17:04:26 +0100 Subject: [PATCH 1/4] rudimentary enterprise support --- cmd/github-mcp-server/main.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/cmd/github-mcp-server/main.go b/cmd/github-mcp-server/main.go index f9de5c8d..3627a8a9 100644 --- a/cmd/github-mcp-server/main.go +++ b/cmd/github-mcp-server/main.go @@ -5,6 +5,7 @@ import ( "fmt" "io" stdlog "log" + "net/url" "os" "os/signal" "syscall" @@ -54,12 +55,14 @@ func init() { rootCmd.PersistentFlags().String("log-file", "", "Path to log file") rootCmd.PersistentFlags().Bool("enable-command-logging", false, "When enabled, the server will log all command requests and responses to the log file") rootCmd.PersistentFlags().Bool("export-translations", false, "Save translations to a JSON file") + rootCmd.PersistentFlags().String("gh-host", "", "Specify the GitHub hostname (for GitHub Enterprise etc.)") // Bind flag to viper viper.BindPFlag("read-only", rootCmd.PersistentFlags().Lookup("read-only")) viper.BindPFlag("log-file", rootCmd.PersistentFlags().Lookup("log-file")) viper.BindPFlag("enable-command-logging", rootCmd.PersistentFlags().Lookup("enable-command-logging")) viper.BindPFlag("export-translations", rootCmd.PersistentFlags().Lookup("export-translations")) + viper.BindPFlag("gh-host", rootCmd.PersistentFlags().Lookup("gh-host")) // Add subcommands rootCmd.AddCommand(stdioCmd) @@ -99,6 +102,20 @@ func runStdioServer(readOnly bool, logger *log.Logger, logCommands bool, exportT logger.Fatal("GITHUB_PERSONAL_ACCESS_TOKEN not set") } ghClient := gogithub.NewClient(nil).WithAuthToken(token) + if host := viper.GetString("gh-host"); host != "" { + parsedURL, err := url.Parse(fmt.Sprintf("https://api.%s/", host)) + if err != nil { + return fmt.Errorf("failed to parse provided GitHub host URL: %w", err) + } + + uploadURL, err := url.Parse(fmt.Sprintf("https://uploads.%s/", host)) + if err != nil { + return fmt.Errorf("failed to parse provided GitHub host URL: %w", err) + } + + ghClient.BaseURL = parsedURL + ghClient.UploadURL = uploadURL + } t, dumpTranslations := translations.TranslationHelper() From 953ae082984249b9fd7b03ea2dff5bf198493f36 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Mon, 24 Mar 2025 17:02:05 +0100 Subject: [PATCH 2/4] take env var and use the With rather than assignment --- cmd/github-mcp-server/main.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/cmd/github-mcp-server/main.go b/cmd/github-mcp-server/main.go index 3627a8a9..0e333aa8 100644 --- a/cmd/github-mcp-server/main.go +++ b/cmd/github-mcp-server/main.go @@ -102,7 +102,14 @@ func runStdioServer(readOnly bool, logger *log.Logger, logCommands bool, exportT logger.Fatal("GITHUB_PERSONAL_ACCESS_TOKEN not set") } ghClient := gogithub.NewClient(nil).WithAuthToken(token) - if host := viper.GetString("gh-host"); host != "" { + + // Check GH_HOST env var first, then fall back to viper config + host := os.Getenv("GH_HOST") + if host == "" { + host = viper.GetString("gh-host") + } + + if host != "" { parsedURL, err := url.Parse(fmt.Sprintf("https://api.%s/", host)) if err != nil { return fmt.Errorf("failed to parse provided GitHub host URL: %w", err) @@ -113,8 +120,10 @@ func runStdioServer(readOnly bool, logger *log.Logger, logCommands bool, exportT return fmt.Errorf("failed to parse provided GitHub host URL: %w", err) } - ghClient.BaseURL = parsedURL - ghClient.UploadURL = uploadURL + ghClient, err = ghClient.WithEnterpriseURLs(parsedURL.String(), uploadURL.String()) + if err != nil { + return fmt.Errorf("failed to create GitHub client with host: %w", err) + } } t, dumpTranslations := translations.TranslationHelper() From bdcb6fa56183a34e27d1e1b945ef8a61d6c8b3fa Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Mon, 24 Mar 2025 17:45:01 +0100 Subject: [PATCH 3/4] clean up and add readme --- README.md | 7 ++++++- cmd/github-mcp-server/main.go | 14 ++------------ 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 76ed3c98..1eb25465 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,7 @@ and set it as the GITHUB_PERSONAL_ACCESS_TOKEN environment variable. - `pull_number`: Pull request number (number, required) - **get_pull_request_reviews** - Get the reviews on a pull request + - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `pull_number`: Pull request number (number, required) @@ -375,7 +376,7 @@ Run **Preferences: Open User Settings (JSON)**, and create or append to the `mcp "args": ["stdio"], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${input:githubpat}" - }, + } } } } @@ -391,6 +392,10 @@ Try something like the following prompt to verify that it works: I'd like to know more about my GitHub profile. ``` +## GitHub Enterprise Server + +The flag `--gh-host` and the environment variable `GH_HOST` can be used to set the GitHub Enterprise Server hostname. + ## TODO Testing diff --git a/cmd/github-mcp-server/main.go b/cmd/github-mcp-server/main.go index 0e333aa8..5e8c520e 100644 --- a/cmd/github-mcp-server/main.go +++ b/cmd/github-mcp-server/main.go @@ -5,7 +5,6 @@ import ( "fmt" "io" stdlog "log" - "net/url" "os" "os/signal" "syscall" @@ -110,17 +109,8 @@ func runStdioServer(readOnly bool, logger *log.Logger, logCommands bool, exportT } if host != "" { - parsedURL, err := url.Parse(fmt.Sprintf("https://api.%s/", host)) - if err != nil { - return fmt.Errorf("failed to parse provided GitHub host URL: %w", err) - } - - uploadURL, err := url.Parse(fmt.Sprintf("https://uploads.%s/", host)) - if err != nil { - return fmt.Errorf("failed to parse provided GitHub host URL: %w", err) - } - - ghClient, err = ghClient.WithEnterpriseURLs(parsedURL.String(), uploadURL.String()) + var err error + ghClient, err = ghClient.WithEnterpriseURLs(host, host) if err != nil { return fmt.Errorf("failed to create GitHub client with host: %w", err) } From 4be10ae7f0fb3f5e2418dcd20f3513869dc661d8 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Mon, 24 Mar 2025 17:48:32 +0100 Subject: [PATCH 4/4] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1eb25465..10e50037 100644 --- a/README.md +++ b/README.md @@ -376,7 +376,7 @@ Run **Preferences: Open User Settings (JSON)**, and create or append to the `mcp "args": ["stdio"], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${input:githubpat}" - } + }, } } }