Skip to content

Commit 27817b7

Browse files
authored
fix: allow tools to be disabled by category (#96)
Fixes #92.
1 parent 2dbb53e commit 27817b7

File tree

2 files changed

+46
-12
lines changed

2 files changed

+46
-12
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ This provides access to your Grafana instance and the surrounding ecosystem.
4242

4343
The list of tools is configurable, so you can choose which tools you want to make available to the MCP client.
4444
This is useful if you don't use certain functionality or if you don't want to take up too much of the context window.
45+
To disable a category of tools, use the `--disable-<category>` flag when starting the server. For example, to disable
46+
the OnCall tools, use `--disable-oncall`.
4547

4648
### Tools
4749

cmd/mcp-grafana/main.go

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,55 @@ import (
1313
"github.com/grafana/mcp-grafana/tools"
1414
)
1515

16-
func newServer() *server.MCPServer {
16+
func maybeAddTools(s *server.MCPServer, tf func(*server.MCPServer), disable bool, category string) {
17+
if disable {
18+
slog.Info("Disabling tools", "category", category)
19+
return
20+
}
21+
tf(s)
22+
}
23+
24+
// disabledTools indicates whether each category of tools should be disabled.
25+
type disabledTools struct {
26+
search, datasource, incident,
27+
prometheus, loki, alerting,
28+
dashboard, oncall bool
29+
}
30+
31+
func (dt *disabledTools) addFlags() {
32+
flag.BoolVar(&dt.search, "disable-search", false, "Disable search tools")
33+
flag.BoolVar(&dt.datasource, "disable-datasource", false, "Disable datasource tools")
34+
flag.BoolVar(&dt.incident, "disable-incident", false, "Disable incident tools")
35+
flag.BoolVar(&dt.prometheus, "disable-prometheus", false, "Disable prometheus tools")
36+
flag.BoolVar(&dt.loki, "disable-loki", false, "Disable loki tools")
37+
flag.BoolVar(&dt.alerting, "disable-alerting", false, "Disable alerting tools")
38+
flag.BoolVar(&dt.dashboard, "disable-dashboard", false, "Disable dashboard tools")
39+
flag.BoolVar(&dt.oncall, "disable-oncall", false, "Disable oncall tools")
40+
}
41+
42+
func (dt *disabledTools) addTools(s *server.MCPServer) {
43+
maybeAddTools(s, tools.AddSearchTools, dt.search, "search")
44+
maybeAddTools(s, tools.AddDatasourceTools, dt.datasource, "datasource")
45+
maybeAddTools(s, tools.AddIncidentTools, dt.incident, "incident")
46+
maybeAddTools(s, tools.AddPrometheusTools, dt.prometheus, "prometheus")
47+
maybeAddTools(s, tools.AddLokiTools, dt.loki, "loki")
48+
maybeAddTools(s, tools.AddAlertingTools, dt.alerting, "alerting")
49+
maybeAddTools(s, tools.AddDashboardTools, dt.dashboard, "dashboard")
50+
maybeAddTools(s, tools.AddOnCallTools, dt.oncall, "oncall")
51+
}
52+
53+
func newServer(dt disabledTools) *server.MCPServer {
1754
s := server.NewMCPServer(
1855
"mcp-grafana",
1956
"0.1.0",
2057
)
21-
tools.AddSearchTools(s)
22-
tools.AddDatasourceTools(s)
23-
tools.AddIncidentTools(s)
24-
tools.AddPrometheusTools(s)
25-
tools.AddLokiTools(s)
26-
tools.AddAlertingTools(s)
27-
tools.AddDashboardTools(s)
28-
tools.AddOnCallTools(s)
58+
dt.addTools(s)
2959
return s
3060
}
3161

32-
func run(transport, addr string, logLevel slog.Level) error {
62+
func run(transport, addr string, logLevel slog.Level, dt disabledTools) error {
3363
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: logLevel})))
34-
s := newServer()
64+
s := newServer(dt)
3565

3666
switch transport {
3767
case "stdio":
@@ -67,9 +97,11 @@ func main() {
6797
)
6898
addr := flag.String("sse-address", "localhost:8000", "The host and port to start the sse server on")
6999
logLevel := flag.String("log-level", "info", "Log level (debug, info, warn, error)")
100+
var dt disabledTools
101+
dt.addFlags()
70102
flag.Parse()
71103

72-
if err := run(transport, *addr, parseLevel(*logLevel)); err != nil {
104+
if err := run(transport, *addr, parseLevel(*logLevel), dt); err != nil {
73105
panic(err)
74106
}
75107
}

0 commit comments

Comments
 (0)