Skip to content

Commit d417caa

Browse files
Use translation strings for server name/title override
Instead of new CLI flags (--server-name, --server-title), reuse the existing string override mechanism that already supports tool title/ description overrides throughout the codebase. Users can now configure the server name and title via: - GITHUB_MCP_SERVER_NAME / GITHUB_MCP_SERVER_TITLE env vars - "SERVER_NAME" / "SERVER_TITLE" keys in github-mcp-server-config.json This is consistent with how all other user-visible strings are overridden (e.g. GITHUB_MCP_TOOL_GET_ME_USER_TITLE). No new struct fields or CLI flags are needed. Co-authored-by: SamMorrowDrums <4811358+SamMorrowDrums@users.noreply.github.com>
1 parent 883579a commit d417caa

File tree

6 files changed

+44
-61
lines changed

6 files changed

+44
-61
lines changed

cmd/github-mcp-server/main.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,6 @@ var (
8080
ttl := viper.GetDuration("repo-access-cache-ttl")
8181
stdioServerConfig := ghmcp.StdioServerConfig{
8282
Version: version,
83-
Name: viper.GetString("server-name"),
84-
Title: viper.GetString("server-title"),
8583
Host: viper.GetString("host"),
8684
Token: token,
8785
EnabledToolsets: enabledToolsets,
@@ -110,8 +108,6 @@ var (
110108
ttl := viper.GetDuration("repo-access-cache-ttl")
111109
httpConfig := ghhttp.ServerConfig{
112110
Version: version,
113-
Name: viper.GetString("server-name"),
114-
Title: viper.GetString("server-title"),
115111
Host: viper.GetString("host"),
116112
Port: viper.GetInt("port"),
117113
BaseURL: viper.GetString("base-url"),
@@ -137,8 +133,6 @@ func init() {
137133
rootCmd.SetVersionTemplate("{{.Short}}\n{{.Version}}\n")
138134

139135
// Add global flags that will be shared by all commands
140-
rootCmd.PersistentFlags().String("server-name", "", "Override the server name in the MCP initialization response")
141-
rootCmd.PersistentFlags().String("server-title", "", "Override the server title in the MCP initialization response")
142136
rootCmd.PersistentFlags().StringSlice("toolsets", nil, github.GenerateToolsetsHelp())
143137
rootCmd.PersistentFlags().StringSlice("tools", nil, "Comma-separated list of specific tools to enable")
144138
rootCmd.PersistentFlags().StringSlice("exclude-tools", nil, "Comma-separated list of tool names to disable regardless of other settings")
@@ -161,8 +155,6 @@ func init() {
161155
httpCmd.Flags().Bool("scope-challenge", false, "Enable OAuth scope challenge responses")
162156

163157
// Bind flag to viper
164-
_ = viper.BindPFlag("server-name", rootCmd.PersistentFlags().Lookup("server-name"))
165-
_ = viper.BindPFlag("server-title", rootCmd.PersistentFlags().Lookup("server-title"))
166158
_ = viper.BindPFlag("toolsets", rootCmd.PersistentFlags().Lookup("toolsets"))
167159
_ = viper.BindPFlag("tools", rootCmd.PersistentFlags().Lookup("tools"))
168160
_ = viper.BindPFlag("exclude_tools", rootCmd.PersistentFlags().Lookup("exclude-tools"))

internal/ghmcp/server.go

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -171,14 +171,6 @@ type StdioServerConfig struct {
171171
// Version of the server
172172
Version string
173173

174-
// Name overrides the server name in the MCP initialization response.
175-
// If empty, defaults to "github-mcp-server".
176-
Name string
177-
178-
// Title overrides the server title in the MCP initialization response.
179-
// If empty, defaults to "GitHub MCP Server".
180-
Title string
181-
182174
// GitHub Host to target for API requests (e.g. github.com or github.enterprise.com)
183175
Host string
184176

@@ -274,8 +266,6 @@ func RunStdioServer(cfg StdioServerConfig) error {
274266

275267
ghServer, err := NewStdioMCPServer(ctx, github.MCPServerConfig{
276268
Version: cfg.Version,
277-
Name: cfg.Name,
278-
Title: cfg.Title,
279269
Host: cfg.Host,
280270
Token: cfg.Token,
281271
EnabledToolsets: cfg.EnabledToolsets,

pkg/github/server.go

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,6 @@ type MCPServerConfig struct {
2020
// Version of the server
2121
Version string
2222

23-
// Name overrides the server name in the MCP initialization response.
24-
// If empty, defaults to "github-mcp-server".
25-
Name string
26-
27-
// Title overrides the server title in the MCP initialization response.
28-
// If empty, defaults to "GitHub MCP Server".
29-
Title string
30-
3123
// GitHub Host to target for API requests (e.g. github.com or github.enterprise.com)
3224
Host string
3325

@@ -109,7 +101,7 @@ func NewMCPServer(ctx context.Context, cfg *MCPServerConfig, deps ToolDependenci
109101
}
110102
}
111103

112-
ghServer := NewServer(cfg.Version, cfg.Name, cfg.Title, serverOpts)
104+
ghServer := NewServer(cfg.Version, cfg.Translator("SERVER_NAME", "github-mcp-server"), cfg.Translator("SERVER_TITLE", "GitHub MCP Server"), serverOpts)
113105

114106
// Add middlewares. Order matters - for example, the error context middleware should be applied last so that it runs FIRST (closest to the handler) to ensure all errors are captured,
115107
// and any middleware that needs to read or modify the context should be before it.

pkg/github/server_test.go

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -151,36 +151,48 @@ func TestNewMCPServer_CreatesSuccessfully(t *testing.T) {
151151
// is already tested in pkg/github/*_test.go.
152152
}
153153

154-
// TestNewServer_NameAndTitle verifies that the server name and title can be
155-
// overridden and fall back to sensible defaults when empty.
156-
func TestNewServer_NameAndTitle(t *testing.T) {
154+
// TestNewServer_NameAndTitleViaTranslation verifies that server name and title
155+
// can be overridden via the translation helper (GITHUB_MCP_SERVER_NAME /
156+
// GITHUB_MCP_SERVER_TITLE env vars or github-mcp-server-config.json) and
157+
// fall back to sensible defaults when not overridden.
158+
func TestNewServer_NameAndTitleViaTranslation(t *testing.T) {
157159
t.Parallel()
158160

159161
tests := []struct {
160162
name string
161-
serverName string
162-
serverTitle string
163+
translator translations.TranslationHelperFunc
163164
expectedName string
164165
expectedTitle string
165166
}{
166167
{
167-
name: "defaults when empty",
168-
serverName: "",
169-
serverTitle: "",
168+
name: "defaults when using NullTranslationHelper",
169+
translator: translations.NullTranslationHelper,
170170
expectedName: "github-mcp-server",
171171
expectedTitle: "GitHub MCP Server",
172172
},
173173
{
174-
name: "custom name and title",
175-
serverName: "my-github-server",
176-
serverTitle: "My GitHub MCP Server",
174+
name: "custom name and title via translator",
175+
translator: func(key, defaultValue string) string {
176+
switch key {
177+
case "SERVER_NAME":
178+
return "my-github-server"
179+
case "SERVER_TITLE":
180+
return "My GitHub MCP Server"
181+
default:
182+
return defaultValue
183+
}
184+
},
177185
expectedName: "my-github-server",
178186
expectedTitle: "My GitHub MCP Server",
179187
},
180188
{
181-
name: "custom name only",
182-
serverName: "ghes-server",
183-
serverTitle: "",
189+
name: "custom name only via translator",
190+
translator: func(key, defaultValue string) string {
191+
if key == "SERVER_NAME" {
192+
return "ghes-server"
193+
}
194+
return defaultValue
195+
},
184196
expectedName: "ghes-server",
185197
expectedTitle: "GitHub MCP Server",
186198
},
@@ -190,34 +202,41 @@ func TestNewServer_NameAndTitle(t *testing.T) {
190202
t.Run(tt.name, func(t *testing.T) {
191203
t.Parallel()
192204

193-
srv := NewServer("v1.0.0", tt.serverName, tt.serverTitle, nil)
205+
srv := NewServer("v1.0.0", tt.translator("SERVER_NAME", "github-mcp-server"), tt.translator("SERVER_TITLE", "GitHub MCP Server"), nil)
194206
require.NotNil(t, srv)
195207

196208
// Connect a client to retrieve the initialize result and verify ServerInfo.
197209
st, ct := mcp.NewInMemoryTransports()
198210
client := mcp.NewClient(&mcp.Implementation{Name: "test-client"}, nil)
199211

200-
var initResult *mcp.InitializeResult
212+
type clientResult struct {
213+
result *mcp.InitializeResult
214+
err error
215+
}
216+
clientResultCh := make(chan clientResult, 1)
201217
go func() {
202218
cs, err := client.Connect(context.Background(), ct, nil)
203-
if err == nil {
204-
initResult = cs.InitializeResult()
219+
if err != nil {
220+
clientResultCh <- clientResult{err: err}
221+
return
205222
}
223+
clientResultCh <- clientResult{result: cs.InitializeResult()}
206224
}()
207225

208226
_, err := srv.Connect(context.Background(), st, nil)
209227
require.NoError(t, err)
210228

211-
// Give the goroutine time to complete
212-
// (In-memory transport is synchronous, so this is safe)
213-
require.Eventually(t, func() bool { return initResult != nil }, time.Second, 10*time.Millisecond)
214-
require.NotNil(t, initResult.ServerInfo)
215-
assert.Equal(t, tt.expectedName, initResult.ServerInfo.Name)
216-
assert.Equal(t, tt.expectedTitle, initResult.ServerInfo.Title)
229+
got := <-clientResultCh
230+
require.NoError(t, got.err)
231+
require.NotNil(t, got.result)
232+
require.NotNil(t, got.result.ServerInfo)
233+
assert.Equal(t, tt.expectedName, got.result.ServerInfo.Name)
234+
assert.Equal(t, tt.expectedTitle, got.result.ServerInfo.Title)
217235
})
218236
}
219237
}
220238

239+
// TestResolveEnabledToolsets verifies the toolset resolution logic.
221240
func TestResolveEnabledToolsets(t *testing.T) {
222241
t.Parallel()
223242

pkg/http/handler.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,6 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
201201

202202
ghServer, err := h.githubMcpServerFactory(r, h.deps, invToUse, &github.MCPServerConfig{
203203
Version: h.config.Version,
204-
Name: h.config.Name,
205-
Title: h.config.Title,
206204
Translator: h.t,
207205
ContentWindowSize: h.config.ContentWindowSize,
208206
Logger: h.logger,

pkg/http/server.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,6 @@ type ServerConfig struct {
3131
// Version of the server
3232
Version string
3333

34-
// Name overrides the server name in the MCP initialization response.
35-
// If empty, defaults to "github-mcp-server".
36-
Name string
37-
38-
// Title overrides the server title in the MCP initialization response.
39-
// If empty, defaults to "GitHub MCP Server".
40-
Title string
41-
4234
// GitHub Host to target for API requests (e.g. github.com or github.enterprise.com)
4335
Host string
4436

0 commit comments

Comments
 (0)