Skip to content

Commit aac23eb

Browse files
committed
feat: tool prefix name
Signed-off-by: hungran <26101787+hungran@users.noreply.github.com>
1 parent 89bb928 commit aac23eb

File tree

3 files changed

+45
-5
lines changed

3 files changed

+45
-5
lines changed

cmd/github-mcp-server/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ var (
5252
EnabledToolsets: enabledToolsets,
5353
DynamicToolsets: viper.GetBool("dynamic_toolsets"),
5454
ReadOnly: viper.GetBool("read-only"),
55+
ToolPrefix: viper.GetString("tool-prefix"),
5556
ExportTranslations: viper.GetBool("export-translations"),
5657
EnableCommandLogging: viper.GetBool("enable-command-logging"),
5758
LogFilePath: viper.GetString("log-file"),
@@ -71,6 +72,7 @@ func init() {
7172
rootCmd.PersistentFlags().StringSlice("toolsets", github.DefaultTools, "An optional comma separated list of groups of tools to allow, defaults to enabling all")
7273
rootCmd.PersistentFlags().Bool("dynamic-toolsets", false, "Enable dynamic toolsets")
7374
rootCmd.PersistentFlags().Bool("read-only", false, "Restrict the server to read-only operations")
75+
rootCmd.PersistentFlags().String("tool-prefix", "", "Optional prefix to add to all tool names (e.g. 'github_')")
7476
rootCmd.PersistentFlags().String("log-file", "", "Path to log file")
7577
rootCmd.PersistentFlags().Bool("enable-command-logging", false, "When enabled, the server will log all command requests and responses to the log file")
7678
rootCmd.PersistentFlags().Bool("export-translations", false, "Save translations to a JSON file")
@@ -80,6 +82,7 @@ func init() {
8082
_ = viper.BindPFlag("toolsets", rootCmd.PersistentFlags().Lookup("toolsets"))
8183
_ = viper.BindPFlag("dynamic_toolsets", rootCmd.PersistentFlags().Lookup("dynamic-toolsets"))
8284
_ = viper.BindPFlag("read-only", rootCmd.PersistentFlags().Lookup("read-only"))
85+
_ = viper.BindPFlag("tool-prefix", rootCmd.PersistentFlags().Lookup("tool-prefix"))
8386
_ = viper.BindPFlag("log-file", rootCmd.PersistentFlags().Lookup("log-file"))
8487
_ = viper.BindPFlag("enable-command-logging", rootCmd.PersistentFlags().Lookup("enable-command-logging"))
8588
_ = viper.BindPFlag("export-translations", rootCmd.PersistentFlags().Lookup("export-translations"))

internal/ghmcp/server.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ type MCPServerConfig struct {
4545
// ReadOnly indicates if we should only offer read-only tools
4646
ReadOnly bool
4747

48+
// ToolPrefix is an optional prefix to add to all tool names (e.g. "github_")
49+
ToolPrefix string
50+
4851
// Translator provides translated text for the server tooling
4952
Translator translations.TranslationHelperFunc
5053
}
@@ -138,11 +141,11 @@ func NewMCPServer(cfg MCPServerConfig) (*server.MCPServer, error) {
138141
}
139142

140143
// Register all mcp functionality with the server
141-
tsg.RegisterAll(ghServer)
144+
tsg.RegisterAllWithPrefix(ghServer, cfg.ToolPrefix)
142145

143146
if cfg.DynamicToolsets {
144147
dynamic := github.InitDynamicToolset(ghServer, tsg, cfg.Translator)
145-
dynamic.RegisterTools(ghServer)
148+
dynamic.RegisterToolsWithPrefix(ghServer, cfg.ToolPrefix)
146149
}
147150

148151
return ghServer, nil
@@ -169,6 +172,9 @@ type StdioServerConfig struct {
169172
// ReadOnly indicates if we should only register read-only tools
170173
ReadOnly bool
171174

175+
// ToolPrefix is an optional prefix to add to all tool names (e.g. "github_")
176+
ToolPrefix string
177+
172178
// ExportTranslations indicates if we should export translations
173179
// See: https://github.com/github/github-mcp-server?tab=readme-ov-file#i18n--overriding-descriptions
174180
ExportTranslations bool
@@ -195,6 +201,7 @@ func RunStdioServer(cfg StdioServerConfig) error {
195201
EnabledToolsets: cfg.EnabledToolsets,
196202
DynamicToolsets: cfg.DynamicToolsets,
197203
ReadOnly: cfg.ReadOnly,
204+
ToolPrefix: cfg.ToolPrefix,
198205
Translator: t,
199206
})
200207
if err != nil {

pkg/toolsets/toolsets.go

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,18 @@ func NewToolsetDoesNotExistError(name string) *ToolsetDoesNotExistError {
2929
return &ToolsetDoesNotExistError{Name: name}
3030
}
3131

32+
// createToolWithPrefixedName creates a new tool with the same properties as the original but with a prefixed name
33+
func createToolWithPrefixedName(original mcp.Tool, prefix string) mcp.Tool {
34+
// Create a new tool with the prefixed name and copy all properties
35+
newTool := mcp.Tool{
36+
Name: prefix + original.Name,
37+
Description: original.Description,
38+
InputSchema: original.InputSchema,
39+
Annotations: original.Annotations,
40+
}
41+
return newTool
42+
}
43+
3244
func NewServerTool(tool mcp.Tool, handler server.ToolHandlerFunc) server.ServerTool {
3345
return server.ServerTool{Tool: tool, Handler: handler}
3446
}
@@ -92,15 +104,29 @@ func (t *Toolset) GetAvailableTools() []server.ServerTool {
92104
}
93105

94106
func (t *Toolset) RegisterTools(s *server.MCPServer) {
107+
t.RegisterToolsWithPrefix(s, "")
108+
}
109+
110+
func (t *Toolset) RegisterToolsWithPrefix(s *server.MCPServer, prefix string) {
95111
if !t.Enabled {
96112
return
97113
}
98114
for _, tool := range t.readTools {
99-
s.AddTool(tool.Tool, tool.Handler)
115+
toolToRegister := tool.Tool
116+
if prefix != "" {
117+
// Create a new tool with the prefixed name
118+
toolToRegister = createToolWithPrefixedName(tool.Tool, prefix)
119+
}
120+
s.AddTool(toolToRegister, tool.Handler)
100121
}
101122
if !t.readOnly {
102123
for _, tool := range t.writeTools {
103-
s.AddTool(tool.Tool, tool.Handler)
124+
toolToRegister := tool.Tool
125+
if prefix != "" {
126+
// Create a new tool with the prefixed name
127+
toolToRegister = createToolWithPrefixedName(tool.Tool, prefix)
128+
}
129+
s.AddTool(toolToRegister, tool.Handler)
104130
}
105131
}
106132
}
@@ -251,8 +277,12 @@ func (tg *ToolsetGroup) EnableToolset(name string) error {
251277
}
252278

253279
func (tg *ToolsetGroup) RegisterAll(s *server.MCPServer) {
280+
tg.RegisterAllWithPrefix(s, "")
281+
}
282+
283+
func (tg *ToolsetGroup) RegisterAllWithPrefix(s *server.MCPServer, prefix string) {
254284
for _, toolset := range tg.Toolsets {
255-
toolset.RegisterTools(s)
285+
toolset.RegisterToolsWithPrefix(s, prefix)
256286
toolset.RegisterResourcesTemplates(s)
257287
toolset.RegisterPrompts(s)
258288
}

0 commit comments

Comments
 (0)