`list_mcp_tools` hangs when MCP endpoint returns plain-text error as `text/event-stream`
Maintainer thường phản hồi trong vòng 1 ngày
@cassiofariasmachado đang làm issue này rồi.
Từ ngày 21/9/2026.
Đánh giá
Issue này chưa được đánh giá.
Mô tả
Describe the Bug
Problem
When an AGW MCP endpoint returns 200 text/event-stream with a plain-text body (e.g. Jwt issuer is not configured) instead of a valid SSE data: event, await session.list_tools()
in list_server_tools() blocks indefinitely.
The MCP SSE parser discards lines without a data: prefix — silently, with no error. The ClientSession then waits forever for a JSON-RPC response that will never arrive. The httpx
timeout does not protect against this because the HTTP response itself completes successfully in ~1s.
Since all fragments run concurrently via asyncio.gather, one hanging fragment blocks the entire list_mcp_tools() call until the outer app-level timeout fires (up to 180s).
Proposed fixes
1. Per-fragment timeout (defensive minimum)
result = await asyncio.wait_for(session.list_tools(), timeout=30.0)
2. Race against stream closure (detects the problem immediately)
done, _ = await asyncio.wait(
[session.list_tools(), stream_closed_event],
return_when=asyncio.FIRST_COMPLETED
)
# if stream closed before list_tools() responded → raise immediately
3. Validate SSE body before entering ClientSession
first_chunk = await response.aread(64)
if not first_chunk.startswith((b"data:", b"event:")):
raise McpError(f"Non-SSE response: {first_chunk.decode(errors='replace')}")
Context
- Reproduced on sap.btpn8n:apiResource:ManagedN8nMcpServer:v1, AGW EU12
- The upstream fix (return 4xx or a proper SSE error event) is tracked separately
- This SDK fix is defensive and needed regardless of the upstream fix
### Steps to Reproduce
### Reproduction
Send `initialize` followed by `tools/list` to any MCP endpoint that returns a plain-text error:
```bash
# initialize — works, returns valid SSE
curl -X POST "<mcp-endpoint>" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'
# tools/list — returns 200 but body is plain text, not an SSE data: event
curl -X POST "<mcp-endpoint>" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
Actual tools/list response:
HTTP/2 200
content-type: text/event-stream
<plain text error message>
Expected tools/list response:
HTTP/2 200
content-type: text/event-stream
event: message
data: {"jsonrpc":"2.0","id":1,"result":{"tools":[...]}}
The body lacks the data: prefix required by the SSE spec. The MCP SSE parser silently discards it, leaving ClientSession blocked on a queue that will never receive a message.
Expected Behavior
Exception must be thrown, but it should not wait indefinitely for a response.
Screenshots
No response
Used Versions
- Python version via
python --version: ... - SAP Cloud SDK for Python version: ...
- Framework version (if applicable, e.g., Flask, FastAPI): ...
Installed packages via pip list or uv pip list
Package list here
Code Examples
# Your code here
Stack Trace
No response
Log File
Log file
...Affected Development Phase
Getting Started
Impact
No Impact
Timeline
No response
- Ngôn ngữ chính
- Python
- Star
- 29
- Fork
- 45
- Merge trung bình
- 2 ngày 4 giờ
- Pull request đã merge (30 ngày)
- 51
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của SAP/cloud-sdk-python
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 15/100
SAP/cloud-sdk-python#474 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Relax opentelemetry-api cap (~=1.44.0) to allow 1.45.2 (fixes CVE-2026-114603 / GHSA-xcq7-p3pf-p88h)Đang mở
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 64/100
SAP/cloud-sdk-python#472 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 25/100
SAP/cloud-sdk-python#456 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 65/100
SAP/cloud-sdk-python#452 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
How/Whether langgraph-checkpoint-hana would be supported by sap-cloud-sdk?Có thể đã có người làm @gpretto đã nhận 3 ngày trước. Đang mởquestion
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 15/100
SAP/cloud-sdk-python#427 · 2 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của SAP/cloud-sdk-python
Issue tương tự
-
generate_observation_scenario_from_cpgs exposure time conversion when auto-gain set to 'yes'Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
roman-corgi/corgisim#327 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
[Bug]: opencode_go chat route drops reasoning_effort (even 'none'), while the same endpoint honors it via custom_llm_provider=openaiCó thể đã có người làm @arvindkumar-ship-it đã nhận hôm nay. Đang mởllm translation
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
BerriAI/litellm#51871 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
Maintainer thường phản hồi trong vòng 1 ngày
-
PolicyEngine backdates South Carolina’s EITC into 2015–2017Có thể đã có người làm @MaxGhenis đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
PolicyEngine/policyengine-us#10944 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
fix(frontend): resolve SSE parser crash on unhandled Ref methods and undefined actions identifierĐang mởbug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
kodokbakar/MiroFish-Local#94 ·
Maintainer thường phản hồi trong vòng 1 ngày