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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions