Skip to content

Commit 5b9ac0a

Browse files
committed
feat(resources): resource support, list_metrics, targets, tsdb_stats
Resource support, under the prefix of "prometheus://". Initial support via a few resources, including prometheus://list_metrics, prometheus://targets, and prometheus://tsdb_stats. Still learning all this shit and trying to understand the functional differences and when a tool is more appropriate than a resource and vice-versa, so I don't even know quite how correct/useful this is yet. Signed-off-by: TJ Hoplock <[email protected]>
1 parent 96445e6 commit 5b9ac0a

File tree

2 files changed

+87
-1
lines changed

2 files changed

+87
-1
lines changed

pkg/mcp/resources.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package mcp
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"time"
7+
8+
"github.com/mark3labs/mcp-go/mcp"
9+
)
10+
11+
var (
12+
// Resources
13+
resourcePrefix = "prometheus://"
14+
15+
listMetricsResource = mcp.NewResource(
16+
resourcePrefix+"list_metrics",
17+
"List metrics",
18+
mcp.WithResourceDescription("List metrics available"),
19+
mcp.WithMIMEType("application/json"),
20+
)
21+
22+
targetsResource = mcp.NewResource(
23+
resourcePrefix+"targets",
24+
"Targets",
25+
mcp.WithResourceDescription("Overview of the current state of the Prometheus target discovery"),
26+
mcp.WithMIMEType("application/json"),
27+
)
28+
29+
tsdbStatsResource = mcp.NewResource(
30+
resourcePrefix+"tsdb_stats",
31+
"TSDB Stats",
32+
mcp.WithResourceDescription("Usage and cardinality statistics from the TSDB"),
33+
mcp.WithMIMEType("application/json"),
34+
)
35+
)
36+
37+
func listMetricsResourceHandler(ctx context.Context, request mcp.ReadResourceRequest) ([]mcp.ResourceContents, error) {
38+
metrics, err := labelValuesApiCall(ctx, "__name__", nil, time.Time{}, time.Time{})
39+
if err != nil {
40+
return nil, fmt.Errorf("error getting metric names: %w", err)
41+
}
42+
43+
return []mcp.ResourceContents{
44+
mcp.TextResourceContents{
45+
URI: resourcePrefix + "list_metrics",
46+
MIMEType: "application/json",
47+
Text: metrics,
48+
},
49+
}, nil
50+
}
51+
52+
func targetsResourceHandler(ctx context.Context, request mcp.ReadResourceRequest) ([]mcp.ResourceContents, error) {
53+
targets, err := targetsApiCall(ctx)
54+
if err != nil {
55+
return nil, fmt.Errorf("error getting target info: %w", err)
56+
}
57+
58+
return []mcp.ResourceContents{
59+
mcp.TextResourceContents{
60+
URI: resourcePrefix + "targets",
61+
MIMEType: "application/json",
62+
Text: targets,
63+
},
64+
}, nil
65+
}
66+
67+
func tsdbStatsResourceHandler(ctx context.Context, request mcp.ReadResourceRequest) ([]mcp.ResourceContents, error) {
68+
tsdbStats, err := tsdbStatsApiCall(ctx)
69+
if err != nil {
70+
return nil, fmt.Errorf("error processing tsdb stats: %w", err)
71+
}
72+
73+
return []mcp.ResourceContents{
74+
mcp.TextResourceContents{
75+
URI: resourcePrefix + "tsdb_stats",
76+
MIMEType: "application/json",
77+
Text: tsdbStats,
78+
},
79+
}, nil
80+
}

pkg/mcp/server.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,22 @@ func NewServer(logger *slog.Logger) *server.MCPServer {
1313

1414
// TODO: remove/improve this hook?
1515
// hooks.AddBeforeCallTool(func(ctx context.Context, id any, message *mcp.CallToolRequest) {
16-
// logger.Debug("Before Call Tool", "id", id, "tool_request", message)
16+
// logger.Debug("Before Call Tool", "id", id, "tool_request", message)
1717
// })
1818

1919
mcpServer := server.NewMCPServer(
2020
"prometheus-mcp-server",
2121
version.Info(),
2222
server.WithLogging(),
2323
server.WithHooks(hooks),
24+
server.WithResourceCapabilities(true, true),
2425
)
2526

27+
// add resources
28+
mcpServer.AddResource(listMetricsResource, listMetricsResourceHandler)
29+
mcpServer.AddResource(targetsResource, targetsResourceHandler)
30+
mcpServer.AddResource(tsdbStatsResource, tsdbStatsResourceHandler)
31+
2632
// add tools
2733
mcpServer.AddTool(alertmanagersTool, alertmanagersToolHandler)
2834
mcpServer.AddTool(buildinfoTool, buildinfoToolHandler)

0 commit comments

Comments
 (0)