From b9a56bf9fdef1d1a45d4c2e336c5a16b286e19a1 Mon Sep 17 00:00:00 2001 From: Ethan Huo Date: Thu, 30 Oct 2025 17:14:10 +0800 Subject: [PATCH] fix: add required Accept header for streamable HTTP transport When connecting to MCP servers via streamable HTTP, mcptools was not setting the Accept header. Some servers like mcp.grep.app require clients to accept both application/json and text/event-stream, and return 405 errors when this header is missing. This change ensures the Accept header is always set for both HTTP and SSE transports, fixing compatibility with servers that enforce this requirement. Tested with mcp.grep.app and existing unit tests pass. --- cmd/mcptools/commands/utils.go | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/cmd/mcptools/commands/utils.go b/cmd/mcptools/commands/utils.go index 2d12508..76cc003 100644 --- a/cmd/mcptools/commands/utils.go +++ b/cmd/mcptools/commands/utils.go @@ -116,26 +116,24 @@ var CreateClientFunc = func(args []string, _ ...client.ClientOption) (*client.Cl return nil, fmt.Errorf("failed to parse authentication: %w", authErr) } - // Create headers map if authentication is provided + // Create headers map with required Accept header for MCP protocol headers := make(map[string]string) + + // Add authentication header if provided if authHeader != "" { headers["Authorization"] = authHeader } + // Add Accept header required by MCP streamable HTTP and SSE transports + // Many MCP servers require clients to accept both JSON responses and event streams + headers["Accept"] = "application/json, text/event-stream" + if TransportOption == "sse" { // For SSE transport, use transport.ClientOption - if len(headers) > 0 { - c, err = client.NewSSEMCPClient(cleanURL, transport.WithHeaders(headers)) - } else { - c, err = client.NewSSEMCPClient(cleanURL) - } + c, err = client.NewSSEMCPClient(cleanURL, transport.WithHeaders(headers)) } else { // For StreamableHTTP transport, use transport.StreamableHTTPCOption - if len(headers) > 0 { - c, err = client.NewStreamableHttpClient(cleanURL, transport.WithHTTPHeaders(headers)) - } else { - c, err = client.NewStreamableHttpClient(cleanURL) - } + c, err = client.NewStreamableHttpClient(cleanURL, transport.WithHTTPHeaders(headers)) } if err != nil {