Skip to content

Commit f710c89

Browse files
committed
feat: tool prefix name
Signed-off-by: hungran <[email protected]>
1 parent 23630b3 commit f710c89

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"),
@@ -72,6 +73,7 @@ func init() {
7273
rootCmd.PersistentFlags().StringSlice("toolsets", github.DefaultTools, "An optional comma separated list of groups of tools to allow, defaults to enabling all")
7374
rootCmd.PersistentFlags().Bool("dynamic-toolsets", false, "Enable dynamic toolsets")
7475
rootCmd.PersistentFlags().Bool("read-only", false, "Restrict the server to read-only operations")
76+
rootCmd.PersistentFlags().String("tool-prefix", "", "Optional prefix to add to all tool names (e.g. 'github_')")
7577
rootCmd.PersistentFlags().String("log-file", "", "Path to log file")
7678
rootCmd.PersistentFlags().Bool("enable-command-logging", false, "When enabled, the server will log all command requests and responses to the log file")
7779
rootCmd.PersistentFlags().Bool("export-translations", false, "Save translations to a JSON file")
@@ -82,6 +84,7 @@ func init() {
8284
_ = viper.BindPFlag("toolsets", rootCmd.PersistentFlags().Lookup("toolsets"))
8385
_ = viper.BindPFlag("dynamic_toolsets", rootCmd.PersistentFlags().Lookup("dynamic-toolsets"))
8486
_ = viper.BindPFlag("read-only", rootCmd.PersistentFlags().Lookup("read-only"))
87+
_ = viper.BindPFlag("tool-prefix", rootCmd.PersistentFlags().Lookup("tool-prefix"))
8588
_ = viper.BindPFlag("log-file", rootCmd.PersistentFlags().Lookup("log-file"))
8689
_ = viper.BindPFlag("enable-command-logging", rootCmd.PersistentFlags().Lookup("enable-command-logging"))
8790
_ = 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

@@ -143,11 +146,11 @@ func NewMCPServer(cfg MCPServerConfig) (*server.MCPServer, error) {
143146
}
144147

145148
// Register all mcp functionality with the server
146-
tsg.RegisterAll(ghServer)
149+
tsg.RegisterAllWithPrefix(ghServer, cfg.ToolPrefix)
147150

148151
if cfg.DynamicToolsets {
149152
dynamic := github.InitDynamicToolset(ghServer, tsg, cfg.Translator)
150-
dynamic.RegisterTools(ghServer)
153+
dynamic.RegisterToolsWithPrefix(ghServer, cfg.ToolPrefix)
151154
}
152155

153156
return ghServer, nil
@@ -174,6 +177,9 @@ type StdioServerConfig struct {
174177
// ReadOnly indicates if we should only register read-only tools
175178
ReadOnly bool
176179

180+
// ToolPrefix is an optional prefix to add to all tool names (e.g. "github_")
181+
ToolPrefix string
182+
177183
// ExportTranslations indicates if we should export translations
178184
// See: https://github.com/github/github-mcp-server?tab=readme-ov-file#i18n--overriding-descriptions
179185
ExportTranslations bool
@@ -203,6 +209,7 @@ func RunStdioServer(cfg StdioServerConfig) error {
203209
EnabledToolsets: cfg.EnabledToolsets,
204210
DynamicToolsets: cfg.DynamicToolsets,
205211
ReadOnly: cfg.ReadOnly,
212+
ToolPrefix: cfg.ToolPrefix,
206213
Translator: t,
207214
ContentWindowSize: cfg.ContentWindowSize,
208215
})

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
}
@@ -80,15 +92,29 @@ func (t *Toolset) GetAvailableTools() []server.ServerTool {
8092
}
8193

8294
func (t *Toolset) RegisterTools(s *server.MCPServer) {
95+
t.RegisterToolsWithPrefix(s, "")
96+
}
97+
98+
func (t *Toolset) RegisterToolsWithPrefix(s *server.MCPServer, prefix string) {
8399
if !t.Enabled {
84100
return
85101
}
86102
for _, tool := range t.readTools {
87-
s.AddTool(tool.Tool, tool.Handler)
103+
toolToRegister := tool.Tool
104+
if prefix != "" {
105+
// Create a new tool with the prefixed name
106+
toolToRegister = createToolWithPrefixedName(tool.Tool, prefix)
107+
}
108+
s.AddTool(toolToRegister, tool.Handler)
88109
}
89110
if !t.readOnly {
90111
for _, tool := range t.writeTools {
91-
s.AddTool(tool.Tool, tool.Handler)
112+
toolToRegister := tool.Tool
113+
if prefix != "" {
114+
// Create a new tool with the prefixed name
115+
toolToRegister = createToolWithPrefixedName(tool.Tool, prefix)
116+
}
117+
s.AddTool(toolToRegister, tool.Handler)
92118
}
93119
}
94120
}
@@ -239,8 +265,12 @@ func (tg *ToolsetGroup) EnableToolset(name string) error {
239265
}
240266

241267
func (tg *ToolsetGroup) RegisterAll(s *server.MCPServer) {
268+
tg.RegisterAllWithPrefix(s, "")
269+
}
270+
271+
func (tg *ToolsetGroup) RegisterAllWithPrefix(s *server.MCPServer, prefix string) {
242272
for _, toolset := range tg.Toolsets {
243-
toolset.RegisterTools(s)
273+
toolset.RegisterToolsWithPrefix(s, prefix)
244274
toolset.RegisterResourcesTemplates(s)
245275
toolset.RegisterPrompts(s)
246276
}

0 commit comments

Comments
 (0)