Skip to content

Commit b8f74a2

Browse files
authored
Add extension points (#78)
adds extension points for downstream forks / extensions of the core kmcp code base
1 parent 41071d1 commit b8f74a2

4 files changed

Lines changed: 56 additions & 15 deletions

File tree

cmd/main.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,9 @@ func main() {
203203
}
204204

205205
if err = (&controller.MCPServerReconciler{
206-
Client: mgr.GetClient(),
207-
Scheme: mgr.GetScheme(),
206+
Client: mgr.GetClient(),
207+
Scheme: mgr.GetScheme(),
208+
Plugins: nil, // Plugins are for 3rd party extensions to open source.
208209
}).SetupWithManager(mgr); err != nil {
209210
setupLog.Error(err, "unable to create controller", "controller", "MCPServer")
210211
os.Exit(1)

pkg/controller/mcpserver_controller.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222

2323
"time"
2424

25-
"github.com/kagent-dev/kmcp/pkg/controller/internal/transportadapter"
25+
"github.com/kagent-dev/kmcp/pkg/controller/transportadapter"
2626

2727
appsv1 "k8s.io/api/apps/v1"
2828
corev1 "k8s.io/api/core/v1"
@@ -40,7 +40,8 @@ import (
4040
// MCPServerReconciler reconciles a MCPServer object
4141
type MCPServerReconciler struct {
4242
client.Client
43-
Scheme *runtime.Scheme
43+
Scheme *runtime.Scheme
44+
Plugins []transportadapter.TranslatorPlugin
4445
}
4546

4647
// +kubebuilder:rbac:groups=kagent.dev,resources=mcpservers,verbs=get;list;watch;create;update;patch;delete
@@ -69,8 +70,8 @@ func (r *MCPServerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
6970
return ctrl.Result{}, client.IgnoreNotFound(err)
7071
}
7172

72-
t := transportadapter.NewTransportAdapterTranslator(r.Scheme)
73-
outputs, err := t.TranslateTransportAdapterOutputs(mcpServer)
73+
t := transportadapter.NewTransportAdapterTranslator(r.Scheme, r.Plugins)
74+
outputs, err := t.TranslateTransportAdapterOutputs(ctx, mcpServer)
7475
if err != nil {
7576
log.FromContext(ctx).Error(err, "Failed to translate MCPServer outputs")
7677
r.reconcileStatus(ctx, mcpServer, err)

pkg/controller/internal/transportadapter/transportadapter_translator.go renamed to pkg/controller/transportadapter/transportadapter_translator.go

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package transportadapter
22

33
import (
4+
"context"
45
"crypto/sha256"
56
"encoding/hex"
67
"fmt"
78
"sort"
89

10+
"go.uber.org/multierr"
911
appsv1 "k8s.io/api/apps/v1"
1012
corev1 "k8s.io/api/core/v1"
1113
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -25,20 +27,32 @@ const (
2527

2628
// Translator is the interface for translating MCPServer objects to TransportAdapter objects.
2729
type Translator interface {
28-
TranslateTransportAdapterOutputs(server *v1alpha1.MCPServer) ([]client.Object, error)
30+
TranslateTransportAdapterOutputs(
31+
ctx context.Context,
32+
server *v1alpha1.MCPServer,
33+
) ([]client.Object, error)
2934
}
3035

36+
type TranslatorPlugin func(
37+
ctx context.Context,
38+
server *v1alpha1.MCPServer,
39+
objects []client.Object,
40+
) ([]client.Object, error)
41+
3142
type transportAdapterTranslator struct {
32-
scheme *runtime.Scheme
43+
scheme *runtime.Scheme
44+
plugins []TranslatorPlugin
3345
}
3446

35-
func NewTransportAdapterTranslator(scheme *runtime.Scheme) Translator {
47+
func NewTransportAdapterTranslator(scheme *runtime.Scheme, plugins []TranslatorPlugin) Translator {
3648
return &transportAdapterTranslator{
37-
scheme: scheme,
49+
scheme: scheme,
50+
plugins: plugins,
3851
}
3952
}
4053

4154
func (t *transportAdapterTranslator) TranslateTransportAdapterOutputs(
55+
ctx context.Context,
4256
server *v1alpha1.MCPServer,
4357
) ([]client.Object, error) {
4458
serviceAccount, err := t.translateTransportAdapterServiceAccount(server)
@@ -57,12 +71,12 @@ func (t *transportAdapterTranslator) TranslateTransportAdapterOutputs(
5771
if err != nil {
5872
return nil, fmt.Errorf("failed to translate TransportAdapter config map: %w", err)
5973
}
60-
return []client.Object{
74+
return t.runPlugins(ctx, server, []client.Object{
6175
serviceAccount,
6276
deployment,
6377
service,
6478
configMap,
65-
}, nil
79+
})
6680
}
6781

6882
func (t *transportAdapterTranslator) translateTransportAdapterDeployment(
@@ -359,7 +373,9 @@ func convertEnvVars(env map[string]string) []corev1.EnvVar {
359373
return envVars
360374
}
361375

362-
func (t *transportAdapterTranslator) translateTransportAdapterService(server *v1alpha1.MCPServer) (*corev1.Service, error) {
376+
func (t *transportAdapterTranslator) translateTransportAdapterService(
377+
server *v1alpha1.MCPServer,
378+
) (*corev1.Service, error) {
363379
port := server.Spec.Deployment.Port
364380
if port == 0 {
365381
return nil, fmt.Errorf("deployment port must be specified for MCPServer %s", server.Name)
@@ -392,7 +408,9 @@ func (t *transportAdapterTranslator) translateTransportAdapterService(server *v1
392408
return service, controllerutil.SetOwnerReference(server, service, t.scheme)
393409
}
394410

395-
func (t *transportAdapterTranslator) translateTransportAdapterConfigAsYAML(server *v1alpha1.MCPServer) (string, error) {
411+
func (t *transportAdapterTranslator) translateTransportAdapterConfigAsYAML(
412+
server *v1alpha1.MCPServer,
413+
) (string, error) {
396414
config, err := t.translateTransportAdapterConfig(server)
397415
if err != nil {
398416
return "", fmt.Errorf("failed to translate MCP server config: %w", err)
@@ -406,7 +424,9 @@ func (t *transportAdapterTranslator) translateTransportAdapterConfigAsYAML(serve
406424
return string(configYaml), nil
407425
}
408426

409-
func (t *transportAdapterTranslator) translateTransportAdapterConfigMap(server *v1alpha1.MCPServer) (*corev1.ConfigMap, error) {
427+
func (t *transportAdapterTranslator) translateTransportAdapterConfigMap(
428+
server *v1alpha1.MCPServer,
429+
) (*corev1.ConfigMap, error) {
410430
configYaml, err := t.translateTransportAdapterConfigAsYAML(server)
411431
if err != nil {
412432
return nil, fmt.Errorf("failed to marshal MCP server config to YAML: %w", err)
@@ -498,3 +518,22 @@ func (t *transportAdapterTranslator) translateTransportAdapterConfig(server *v1a
498518

499519
return config, nil
500520
}
521+
522+
func (t *transportAdapterTranslator) runPlugins(
523+
ctx context.Context,
524+
server *v1alpha1.MCPServer,
525+
objects []client.Object,
526+
) ([]client.Object, error) {
527+
var errs error
528+
if len(t.plugins) > 0 {
529+
for _, plugin := range t.plugins {
530+
out, err := plugin(ctx, server, objects)
531+
if err != nil {
532+
errs = multierr.Append(errs, fmt.Errorf("plugin %T failed: %w", plugin, err))
533+
}
534+
objects = out
535+
}
536+
}
537+
538+
return objects, errs
539+
}

pkg/controller/internal/transportadapter/transportadapter_types.go renamed to pkg/controller/transportadapter/transportadapter_types.go

File renamed without changes.

0 commit comments

Comments
 (0)