Skip to content

Commit c76dc18

Browse files
committed
refactor: use new ManagerProvider/mutator/filter within mcp server
Signed-off-by: Calum Murray <[email protected]>
1 parent b777225 commit c76dc18

File tree

2 files changed

+31
-12
lines changed

2 files changed

+31
-12
lines changed

pkg/mcp/m3labs.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ func ServerToolToM3LabsServerTool(s *Server, tools []api.ServerTool) ([]server.S
3939
m3labTool.RawInputSchema = schema
4040
}
4141
m3labHandler := func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
42-
// get the correct internalks.Manager for the cluster specified in the request
43-
cluster := request.GetString("cluster", s.p.GetDefaultCluster())
44-
m, err := s.p.GetClusterManager(ctx, cluster)
42+
// get the correct internalk8s.Manager for the target specified in the request
43+
cluster := request.GetString(s.p.GetTargetParameterName(), s.p.GetDefaultTarget())
44+
m, err := s.p.GetManagerFor(ctx, cluster)
4545
if err != nil {
4646
return nil, err
4747
}
@@ -55,6 +55,7 @@ func ServerToolToM3LabsServerTool(s *Server, tools []api.ServerTool) ([]server.S
5555
result, err := tool.Handler(api.ToolHandlerParams{
5656
Context: ctx,
5757
Kubernetes: k,
58+
ManagerProvider: s.p,
5859
ToolCallRequest: request,
5960
ListOutput: s.configuration.ListOutput(),
6061
})

pkg/mcp/mcp.go

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ type Server struct {
6767
configuration *Configuration
6868
server *server.MCPServer
6969
enabledTools []string
70-
p internalk8s.ClusterProvider
70+
p internalk8s.ManagerProvider
7171
}
7272

7373
func NewServer(configuration Configuration) (*Server, error) {
@@ -94,14 +94,14 @@ func NewServer(configuration Configuration) (*Server, error) {
9494
if err := s.reloadKubernetesClusterProvider(); err != nil {
9595
return nil, err
9696
}
97-
s.p.WatchClusters(s.reloadKubernetesClusterProvider)
97+
s.p.WatchTargets(s.reloadKubernetesClusterProvider)
9898

9999
return s, nil
100100
}
101101

102102
func (s *Server) reloadKubernetesClusterProvider() error {
103103
ctx := context.Background()
104-
p, err := internalk8s.NewClusterProvider(s.configuration.StaticConfig)
104+
p, err := internalk8s.NewManagerProvider(s.configuration.StaticConfig)
105105
if err != nil {
106106
return err
107107
}
@@ -113,23 +113,33 @@ func (s *Server) reloadKubernetesClusterProvider() error {
113113

114114
s.p = p
115115

116-
k, err := s.p.GetClusterManager(ctx, s.p.GetDefaultCluster())
116+
k, err := s.p.GetManagerFor(ctx, s.p.GetDefaultTarget())
117117
if err != nil {
118118
return err
119119
}
120120

121-
clusters, err := p.GetClusters(ctx)
121+
targets, err := p.GetTargets(ctx)
122122
if err != nil {
123123
return err
124124
}
125125

126-
mutator := WithClusterParameter(p.GetDefaultCluster(), clusters, []string{}) // TODO: see which tools (if any) do not need the cluster parameter
126+
filter := CompositeFilter(
127+
s.configuration.isToolApplicable,
128+
ShouldIncludeTargetListTool(p.GetTargetParameterName(), targets),
129+
)
130+
131+
mutator := WithTargetParameter(
132+
p.GetDefaultTarget(),
133+
p.GetTargetParameterName(),
134+
targets,
135+
[]string{"configuration_view"}, // TODO: see which tools (if any) do not need the cluster parameter
136+
)
127137

128138
applicableTools := make([]api.ServerTool, 0)
129139
for _, toolset := range s.configuration.Toolsets() {
130140
for _, tool := range toolset.GetTools(k) {
131141
tool := mutator(tool)
132-
if !s.configuration.isToolApplicable(tool) {
142+
if !filter(tool) {
133143
continue
134144
}
135145

@@ -177,18 +187,26 @@ func (s *Server) KubernetesApiVerifyToken(ctx context.Context, token string, aud
177187

178188
// Use provided cluster or default
179189
if cluster == "" {
180-
cluster = s.p.GetDefaultCluster()
190+
cluster = s.p.GetDefaultTarget()
181191
}
182192

183193
// Get the cluster manager for the specified cluster
184-
m, err := s.p.GetClusterManager(ctx, cluster)
194+
m, err := s.p.GetManagerFor(ctx, cluster)
185195
if err != nil {
186196
return nil, nil, err
187197
}
188198

189199
return m.VerifyToken(ctx, token, audience)
190200
}
191201

202+
// GetTargetParameterName returns the parameter name used for target identification in MCP requests
203+
func (s *Server) GetTargetParameterName() string {
204+
if s.p == nil {
205+
return "" // fallback for uninitialized provider
206+
}
207+
return s.p.GetTargetParameterName()
208+
}
209+
192210
func (s *Server) GetEnabledTools() []string {
193211
return s.enabledTools
194212
}

0 commit comments

Comments
 (0)