From 93e3b086ceb7fb00f145d15a224351730fc67fde Mon Sep 17 00:00:00 2001 From: Jingze <52855280+Jing-ze@users.noreply.github.com> Date: Mon, 31 Mar 2025 15:40:36 +0800 Subject: [PATCH] fix: fix bug of mcp server proxy (#1981) --- plugins/golang-filter/mcp-server/config.go | 4 ++-- plugins/golang-filter/mcp-server/filter.go | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/plugins/golang-filter/mcp-server/config.go b/plugins/golang-filter/mcp-server/config.go index 1777ae4f0..4c583fff0 100644 --- a/plugins/golang-filter/mcp-server/config.go +++ b/plugins/golang-filter/mcp-server/config.go @@ -88,8 +88,8 @@ func (p *parser) Parse(any *anypb.Any, callbacks api.ConfigCallbackHandler) (int conf.redisClient = redisClient ssePathSuffix, ok := v.AsMap()["sse_path_suffix"].(string) - if !ok { - return nil, fmt.Errorf("sse path suffix is not set") + if !ok || ssePathSuffix == "" { + return nil, fmt.Errorf("sse path suffix is not set or empty") } conf.ssePathSuffix = ssePathSuffix diff --git a/plugins/golang-filter/mcp-server/filter.go b/plugins/golang-filter/mcp-server/filter.go index b0b1c31b5..198132f30 100644 --- a/plugins/golang-filter/mcp-server/filter.go +++ b/plugins/golang-filter/mcp-server/filter.go @@ -24,6 +24,7 @@ type filter struct { req *http.Request serverName string message bool + proxyURL *url.URL } type RequestURL struct { @@ -54,6 +55,7 @@ func (f *filter) DecodeHeaders(header api.RequestHeaderMap, endStream bool) api. // Check if request matches any rule in match_list if !internal.IsMatch(f.config.matchList, url.host, f.path) { + api.LogDebugf("Request does not match any rule in match_list: %s", url.parsedURL.String()) return api.Continue } @@ -94,6 +96,7 @@ func (f *filter) DecodeHeaders(header api.RequestHeaderMap, endStream bool) api. } } if !strings.HasSuffix(url.parsedURL.Path, f.config.ssePathSuffix) { + f.proxyURL = url.parsedURL return api.Continue } @@ -154,8 +157,8 @@ func (f *filter) EncodeData(buffer api.BufferInstance, endStream bool) api.Statu if !endStream { return api.StopAndBuffer } - if f.req != nil { - sessionID := f.req.URL.Query().Get("sessionId") + if f.proxyURL != nil { + sessionID := f.proxyURL.Query().Get("sessionId") if sessionID != "" { channel := internal.GetSSEChannelName(sessionID) publishErr := f.config.redisClient.Publish(channel, buffer.String())