Skip to content

Commit

Permalink
✨ 🚜 🔥 Big refactor of how the transport and registries work
Browse files Browse the repository at this point in the history
  • Loading branch information
wesen committed Feb 16, 2025
1 parent 294b4da commit 874715b
Show file tree
Hide file tree
Showing 43 changed files with 1,242 additions and 2,663 deletions.
4 changes: 2 additions & 2 deletions cmd/go-go-mcp/cmds/bridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"context"
"fmt"

"github.com/go-go-golems/go-go-mcp/pkg/server/transports/stdio"
"github.com/go-go-golems/go-go-mcp/pkg/server"
"github.com/rs/zerolog"
"github.com/spf13/cobra"
)
Expand All @@ -22,7 +22,7 @@ This is useful when you want to connect a stdio client to a remote SSE server.`,
return fmt.Errorf("SSE URL is required")
}

server := stdio.NewSSEBridgeServer(logger, sseURL)
server := server.NewSSEBridgeServer(logger, sseURL)
return server.Start(context.Background())
},
}
Expand Down
9 changes: 9 additions & 0 deletions cmd/go-go-mcp/cmds/server/server.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package server

import (
"github.com/go-go-golems/glazed/pkg/cli"
"github.com/rs/zerolog/log"
"github.com/spf13/cobra"
)

Expand All @@ -13,4 +15,11 @@ var ServerCmd = &cobra.Command{

func init() {
ServerCmd.AddCommand(ToolsCmd)
startCmd, err := NewStartCommand()
if err != nil {
log.Fatal().Err(err).Msg("failed to create start command")
}
cobraStartCmd, err := cli.BuildCobraCommandFromBareCommand(startCmd)
cobra.CheckErr(err)
ServerCmd.AddCommand(cobraStartCmd)
}
73 changes: 47 additions & 26 deletions cmd/go-go-mcp/cmds/start.go → cmd/go-go-mcp/cmds/server/start.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package cmds
package server

import (
"context"
Expand All @@ -11,10 +11,12 @@ import (

"github.com/go-go-golems/glazed/pkg/cmds"
glazed_layers "github.com/go-go-golems/glazed/pkg/cmds/layers"

"github.com/go-go-golems/glazed/pkg/cmds/parameters"
"github.com/go-go-golems/go-go-mcp/cmd/go-go-mcp/cmds/server/layers"
"github.com/go-go-golems/go-go-mcp/pkg/server"
"github.com/go-go-golems/go-go-mcp/pkg/transport"
"github.com/go-go-golems/go-go-mcp/pkg/transport/sse"
"github.com/go-go-golems/go-go-mcp/pkg/transport/stdio"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
"golang.org/x/sync/errgroup"
Expand Down Expand Up @@ -67,25 +69,55 @@ func (c *StartCommand) Run(
ctx context.Context,
parsedLayers *glazed_layers.ParsedLayers,
) error {
s := &StartCommandSettings{}
if err := parsedLayers.InitializeStruct(glazed_layers.DefaultSlug, s); err != nil {
logger := log.Logger

s_ := &StartCommandSettings{}
if err := parsedLayers.InitializeStruct(glazed_layers.DefaultSlug, s_); err != nil {
return err
}

// Get transport type from flags
transportType := s_.Transport
port := s_.Port

// Create transport based on type
var t transport.Transport
var err error

switch transportType {
case "sse":
t, err = sse.NewSSETransport(
transport.WithLogger(logger),
transport.WithSSEOptions(transport.SSEOptions{
Addr: fmt.Sprintf(":%d", port),
}),
)
case "stdio":
t, err = stdio.NewStdioTransport(
transport.WithLogger(logger),
)
default:
return fmt.Errorf("unsupported transport type: %s", transportType)
}

if err != nil {
return fmt.Errorf("failed to create transport: %w", err)
}

// Get server settings
serverSettings := &layers.ServerSettings{}
if err := parsedLayers.InitializeStruct(layers.ServerLayerSlug, serverSettings); err != nil {
return err
}

// Create server
srv := server.NewServer(log.Logger)

// Create tool provider
toolProvider, err := layers.CreateToolProvider(serverSettings)
if err != nil {
return err
}

srv.GetRegistry().RegisterToolProvider(toolProvider)
// Create and start server with transport
s := server.NewServer(logger, t, server.WithToolProvider(toolProvider))

// Create a context that will be cancelled on SIGINT/SIGTERM
ctx, stop := signal.NotifyContext(ctx, os.Interrupt, syscall.SIGTERM)
Expand All @@ -96,27 +128,16 @@ func (c *StartCommand) Run(
// Start file watcher
g.Go(func() error {
if err := toolProvider.Watch(gctx); err != nil {
log.Error().Err(err).Msg("failed to start file watcher")
logger.Error().Err(err).Msg("failed to start file watcher")
return err
}
return nil
})

// Start server
g.Go(func() error {
var err error
switch s.Transport {
case "stdio":
log.Info().Msg("Starting server with stdio transport")
err = srv.StartStdio(gctx)
case "sse":
log.Info().Int("port", s.Port).Msg("Starting server with SSE transport")
err = srv.StartSSE(gctx, s.Port)
default:
err = fmt.Errorf("invalid transport type: %s", s.Transport)
}
if err != nil && err != io.EOF {
log.Error().Err(err).Msg("Server error")
if err := s.Start(gctx); err != nil && err != io.EOF {
logger.Error().Err(err).Msg("Server error")
return err
}
return nil
Expand All @@ -125,14 +146,14 @@ func (c *StartCommand) Run(
// Add graceful shutdown handler
g.Go(func() error {
<-gctx.Done()
log.Info().Msg("Initiating graceful shutdown")
logger.Info().Msg("Initiating graceful shutdown")
shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), 30*time.Second)
defer shutdownCancel()
if err := srv.Stop(shutdownCtx); err != nil {
log.Error().Err(err).Msg("Error during shutdown")
if err := s.Stop(shutdownCtx); err != nil {
logger.Error().Err(err).Msg("Error during shutdown")
return err
}
log.Info().Msg("Server stopped gracefully")
logger.Info().Msg("Server stopped gracefully")
return nil
})

Expand Down
2 changes: 1 addition & 1 deletion cmd/go-go-mcp/cmds/server/tools.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ func (c *ListToolsCommand) RunIntoGlazeProcessor(
return err
}

tools, cursor, err := toolProvider.ListTools("")
tools, cursor, err := toolProvider.ListTools(ctx, "")
if err != nil {
return err
}
Expand Down
7 changes: 0 additions & 7 deletions cmd/go-go-mcp/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,13 +82,6 @@ func initRootCmd() (*help.HelpSystem, error) {

rootCmd.AddCommand(runCommandCmd)

// Create and add start command
startCmd, err := mcp_cmds.NewStartCommand()
cobra.CheckErr(err)
cobraStartCmd, err := cli.BuildCobraCommandFromBareCommand(startCmd)
cobra.CheckErr(err)
rootCmd.AddCommand(cobraStartCmd)

// Create and add schema command
schemaCmd, err := mcp_cmds.NewSchemaCommand()
cobra.CheckErr(err)
Expand Down
185 changes: 0 additions & 185 deletions pkg/cmds/shell-tool-provider.go

This file was deleted.

4 changes: 2 additions & 2 deletions pkg/doc/topics/01-config-file.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ profiles:
Save this as `config.yaml` and run:
```bash
go-go-mcp start --config-file config.yaml
go-go-mcp server start --config-file config.yaml
```

This will:
Expand Down Expand Up @@ -130,7 +130,7 @@ profiles:

To use a specific profile:
```bash
go-go-mcp start --config-file config.yaml --profile production
go-go-mcp server start --config-file config.yaml --profile production
```

## Tool Configuration
Expand Down
Loading

0 comments on commit 874715b

Please sign in to comment.