-
-
Notifications
You must be signed in to change notification settings - Fork 170
[BUG] SSE不支持传入的Header #288
Description
⚠️ 验证
- 我已经搜索过 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)
}
希望大佬能看到这个问题