Skip to content

fix bug #91

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 1 addition & 36 deletions transport/http/gin.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"net/http"

"github.com/gin-gonic/gin"
"github.com/metoro-io/mcp-golang/transport"
)

// GinTransport implements a stateless HTTP transport for MCP using Gin
Expand All @@ -27,46 +26,12 @@ func (t *GinTransport) Start(ctx context.Context) error {
return nil
}

// Send implements Transport.Send
func (t *GinTransport) Send(ctx context.Context, message *transport.BaseJsonRpcMessage) error {
key := message.JsonRpcResponse.Id
responseChannel := t.responseMap[int64(key)]
if responseChannel == nil {
return fmt.Errorf("no response channel found for key: %d", key)
}
responseChannel <- message
return nil
}

// Close implements Transport.Close
func (t *GinTransport) Close() error {
if t.closeHandler != nil {
t.closeHandler()
}
t.baseTransport.Close()
return nil
}

// SetCloseHandler implements Transport.SetCloseHandler
func (t *GinTransport) SetCloseHandler(handler func()) {
t.mu.Lock()
defer t.mu.Unlock()
t.closeHandler = handler
}

// SetErrorHandler implements Transport.SetErrorHandler
func (t *GinTransport) SetErrorHandler(handler func(error)) {
t.mu.Lock()
defer t.mu.Unlock()
t.errorHandler = handler
}

// SetMessageHandler implements Transport.SetMessageHandler
func (t *GinTransport) SetMessageHandler(handler func(ctx context.Context, message *transport.BaseJsonRpcMessage)) {
t.mu.Lock()
defer t.mu.Unlock()
t.messageHandler = handler
}

// Handler returns a Gin handler function that can be used with Gin's router
func (t *GinTransport) Handler() gin.HandlerFunc {
return func(c *gin.Context) {
Expand Down
51 changes: 4 additions & 47 deletions transport/http/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,14 @@ import (
"encoding/json"
"fmt"
"net/http"
"sync"

"github.com/metoro-io/mcp-golang/transport"
)

// HTTPTransport implements a stateless HTTP transport for MCP
type HTTPTransport struct {
*baseTransport
server *http.Server
endpoint string
messageHandler func(ctx context.Context, message *transport.BaseJsonRpcMessage)
errorHandler func(error)
closeHandler func()
mu sync.RWMutex
addr string
responseMap map[int64]chan *transport.BaseJsonRpcMessage
server *http.Server
endpoint string
addr string
}

// NewHTTPTransport creates a new HTTP transport that listens on the specified endpoint
Expand All @@ -29,7 +21,6 @@ func NewHTTPTransport(endpoint string) *HTTPTransport {
baseTransport: newBaseTransport(),
endpoint: endpoint,
addr: ":8080", // Default port
responseMap: make(map[int64]chan *transport.BaseJsonRpcMessage),
}
}

Expand All @@ -52,51 +43,17 @@ func (t *HTTPTransport) Start(ctx context.Context) error {
return t.server.ListenAndServe()
}

// Send implements Transport.Send
func (t *HTTPTransport) Send(ctx context.Context, message *transport.BaseJsonRpcMessage) error {
key := message.JsonRpcResponse.Id
responseChannel := t.responseMap[int64(key)]
if responseChannel == nil {
return fmt.Errorf("no response channel found for key: %d", key)
}
responseChannel <- message
return nil
}

// Close implements Transport.Close
func (t *HTTPTransport) Close() error {
if t.server != nil {
if err := t.server.Close(); err != nil {
return err
}
}
if t.closeHandler != nil {
t.closeHandler()
}
t.baseTransport.Close()
return nil
}

// SetCloseHandler implements Transport.SetCloseHandler
func (t *HTTPTransport) SetCloseHandler(handler func()) {
t.mu.Lock()
defer t.mu.Unlock()
t.closeHandler = handler
}

// SetErrorHandler implements Transport.SetErrorHandler
func (t *HTTPTransport) SetErrorHandler(handler func(error)) {
t.mu.Lock()
defer t.mu.Unlock()
t.errorHandler = handler
}

// SetMessageHandler implements Transport.SetMessageHandler
func (t *HTTPTransport) SetMessageHandler(handler func(ctx context.Context, message *transport.BaseJsonRpcMessage)) {
t.mu.Lock()
defer t.mu.Unlock()
t.messageHandler = handler
}

func (t *HTTPTransport) handleRequest(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Only POST method is supported", http.StatusMethodNotAllowed)
Expand Down
2 changes: 1 addition & 1 deletion transport/http/http_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ func (t *HTTPClientTransport) Send(ctx context.Context, message *transport.BaseJ
return fmt.Errorf("failed to read response: %w", err)
}

if resp.StatusCode != http.StatusOK {
if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusAccepted {
return fmt.Errorf("server returned error: %s (status: %d)", string(body), resp.StatusCode)
}

Expand Down