Skip to content

[BUG] SSE不支持传入的Header #288

@Hermyone

Description

@Hermyone

⚠️ 验证

  • 我已经搜索过 issues,确信这不是一个重复的问题。

Go 版本

1.24.1

Unla 版本

Unla v0.9.0

Platform

macOS

📝 Bug 描述

注册的SSE服务,SSE client 自定义了请求的header 通过Unla 无法传递。

🔄 复现步骤

我简单的提供下python代码 import asyncio
from mcp import ClientSession
from mcp.client.sse import sse_client
from mcp.types import TextContent

async def main():
print("开始连接 SSE 服务器...")
# 目标 SSE 服务器地址
sse_server_url = "http://localhost:5235/gateway/sse1/sse"
# sse_server_url = "http://127.0.0.1:8001/sse"

# 定义需要添加的请求头,包含 code_id
request_headers = {
    "x-code_id": "XX:"  # 鉴权字段
}

# 连接 SSE 服务器并创建客户端会话(传入 headers)
async with sse_client(
    url=sse_server_url,
    headers=request_headers,  # 添加请求头
    timeout=10,  # 常规 HTTP 操作超时(秒)
    sse_read_timeout=300,  # SSE 长连接读取超时(秒)
) as (read_stream, write_stream):
    # 初始化客户端会话
    async with ClientSession(read_stream, write_stream) as session:
        # 1. 初始化会话(协商协议版本等)
        init_result = await session.initialize()
        print(f"init_result___: {init_result}")
        print(f"初始化成功,服务器名称: {init_result.serverInfo.name}")
        print(f"协议版本: {init_result.protocolVersion}")

        # 2. 列出可用工具
        tools = await session.list_tools()
        print("\n可用工具列表:")
        for tool in tools.tools:
            print(f"- 名称: {tool.name}, 描述: {tool.description}")

        # 3. 调用工具(以第一个工具为例)
        if tools.tools:
            sample_tool = tools.tools[0].name

            for tool in tools.tools:
                print(
                    f"tool___: {tool.name}, {tool.description} {tool.inputSchema} {tool.outputSchema}"
                )
            # 工具参数
            tool_args = {"city": "郑州"}
            print(f"调用工具 {sample_tool} 参数: {tool_args}")
            try:
                tool_result = await session.call_tool(
                    name=sample_tool, arguments=tool_args
                )
                print(f"tool_result___: {tool_result}")
                for content in tool_result.content:
                    if isinstance(content, TextContent):
                        print(f"\n工具 {sample_tool} 调用结果: {content.text}")
            except Exception as e:
                print(f"调用工具 {sample_tool} 失败: {str(e)}")

if name == "main":
print("开始执行 mcpClient.py")
asyncio.run(main())
自定义的x-code_id 会被忽略掉。

✅ 预期行为

希望可以解决这个问题。

❌ 实际行为

如果SSE需要在Header中进行鉴权的话,无法鉴权。

💡 可能的解决方案

下面是个人愚见:在interal/core/mcpproxy/sse.go 31行 func (t *SSETransport) Start(ctx context.Context, tmplCtx *template.Context) error {} 这个方法中

// Create SSE transport
sseTransport, err := transport.NewSSE(t.cfg.URL) 这个地方 创建的时候,

增加方法 transport.WithHeaders()
sseTransport, err := transport.NewSSE(t.cfg.URL, transport.WithHeaders(tmplCtx.Request.Headers))

if tmplCtx!=nil{
	transport.WithHeaders(tmplCtx.Request.Headers)
	
}

希望大佬能看到这个问题

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions