Skip to content

Commit 8864030

Browse files
authored
Add allow list for tool categories (#100)
Right now it is only possible to disable categories of tools which is tedious for users who want to only use one or two categories, and means that new tools added in the future will automatically show up. Add the ability to also set an allow-list of tools that can then be overridden using the --disable-<category> flags.
1 parent ab07634 commit 8864030

File tree

1 file changed

+21
-9
lines changed

1 file changed

+21
-9
lines changed

cmd/mcp-grafana/main.go

+21-9
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,32 @@ import (
66
"fmt"
77
"log/slog"
88
"os"
9+
"slices"
10+
"strings"
911

1012
"github.com/mark3labs/mcp-go/server"
1113

1214
mcpgrafana "github.com/grafana/mcp-grafana"
1315
"github.com/grafana/mcp-grafana/tools"
1416
)
1517

16-
func maybeAddTools(s *server.MCPServer, tf func(*server.MCPServer), disable bool, category string) {
18+
func maybeAddTools(s *server.MCPServer, tf func(*server.MCPServer), enabledTools []string, disable bool, category string) {
19+
if !slices.Contains(enabledTools, category) {
20+
slog.Debug("Not enabling tools", "category", category)
21+
return
22+
}
1723
if disable {
1824
slog.Info("Disabling tools", "category", category)
1925
return
2026
}
27+
slog.Debug("Enabling tools", "category", category)
2128
tf(s)
2229
}
2330

2431
// disabledTools indicates whether each category of tools should be disabled.
2532
type disabledTools struct {
33+
enabledTools string
34+
2635
search, datasource, incident,
2736
prometheus, loki, alerting,
2837
dashboard, oncall bool
@@ -35,6 +44,8 @@ type grafanaConfig struct {
3544
}
3645

3746
func (dt *disabledTools) addFlags() {
47+
flag.StringVar(&dt.enabledTools, "enabled-tools", "search,datasource,incident,prometheus,loki,alerting,dashboard,oncall", "A comma separated list of tools enabled for this server. Can be overwritten entirely or by disabling specific components, e.g. --disable-search.")
48+
3849
flag.BoolVar(&dt.search, "disable-search", false, "Disable search tools")
3950
flag.BoolVar(&dt.datasource, "disable-datasource", false, "Disable datasource tools")
4051
flag.BoolVar(&dt.incident, "disable-incident", false, "Disable incident tools")
@@ -50,14 +61,15 @@ func (gc *grafanaConfig) addFlags() {
5061
}
5162

5263
func (dt *disabledTools) addTools(s *server.MCPServer) {
53-
maybeAddTools(s, tools.AddSearchTools, dt.search, "search")
54-
maybeAddTools(s, tools.AddDatasourceTools, dt.datasource, "datasource")
55-
maybeAddTools(s, tools.AddIncidentTools, dt.incident, "incident")
56-
maybeAddTools(s, tools.AddPrometheusTools, dt.prometheus, "prometheus")
57-
maybeAddTools(s, tools.AddLokiTools, dt.loki, "loki")
58-
maybeAddTools(s, tools.AddAlertingTools, dt.alerting, "alerting")
59-
maybeAddTools(s, tools.AddDashboardTools, dt.dashboard, "dashboard")
60-
maybeAddTools(s, tools.AddOnCallTools, dt.oncall, "oncall")
64+
enabledTools := strings.Split(dt.enabledTools, ",")
65+
maybeAddTools(s, tools.AddSearchTools, enabledTools, dt.search, "search")
66+
maybeAddTools(s, tools.AddDatasourceTools, enabledTools, dt.datasource, "datasource")
67+
maybeAddTools(s, tools.AddIncidentTools, enabledTools, dt.incident, "incident")
68+
maybeAddTools(s, tools.AddPrometheusTools, enabledTools, dt.prometheus, "prometheus")
69+
maybeAddTools(s, tools.AddLokiTools, enabledTools, dt.loki, "loki")
70+
maybeAddTools(s, tools.AddAlertingTools, enabledTools, dt.alerting, "alerting")
71+
maybeAddTools(s, tools.AddDashboardTools, enabledTools, dt.dashboard, "dashboard")
72+
maybeAddTools(s, tools.AddOnCallTools, enabledTools, dt.oncall, "oncall")
6173
}
6274

6375
func newServer(dt disabledTools) *server.MCPServer {

0 commit comments

Comments
 (0)