Skip to content

fix: 修复 SSE 模式下的 TypeError 异常 + 更新README#4

Open
eggylan wants to merge 1 commit into
MCNeteaseDevs:mainfrom
eggylan:main
Open

fix: 修复 SSE 模式下的 TypeError 异常 + 更新README#4
eggylan wants to merge 1 commit into
MCNeteaseDevs:mainfrom
eggylan:main

Conversation

@eggylan
Copy link
Copy Markdown

@eggylan eggylan commented Mar 23, 2026

修复 SSE 模式下的 TypeError 异常

问题描述

在启动SSE服务器后,客户端调用 /messages 端点时出现以下错误:

TypeError: 'NoneType' object is not callable

错误发生在 Starlette 路由处理过程中,导致 MCP 客户端无法正常通信。

错误原因

  1. 原代码使用 Route 包装 sse.handle_post_message,但该方法本身是 ASGI 应用,直接返回 None,导致 Starlette 尝试调用 None 作为响应对象
  2. handle_sse 函数在 SSE 连接结束后没有返回 Response 对象
  3. 消息端点缺少尾斜杠,导致 POST 请求触发 307 重定向

修复内容

1. 按 MCP 官方示例正确集成 SSE 路由

# 修改前
Route("/messages", endpoint=handle_messages, methods=["POST"])

# 修改后
Mount("/messages/", app=sse.handle_post_message)

2. 在 SSE 处理函数中返回空响应

async def handle_sse(request):
    async with sse.connect_sse(
        request.scope, request.receive, request._send
    ) as streams:
        await server.run(
            streams[0],
            streams[1],
            server.create_initialization_options()
        )
    return Response()

3. 统一消息端点路径

# 创建 SSE transport 时使用带尾斜杠的路径
sse = SseServerTransport("/messages/")

# Mount 路径也使用尾斜杠
Mount("/messages/", app=sse.handle_post_message)

测试结果

✅ 服务正常启动
✅ POST /messages/?session_id=xxx 返回预期响应(无效 session 返回 400)
✅ GET /sse 正常建立 SSE 连接
✅ GET /health 返回 {"status":"ok","server":"netease-modsdk-mcp"}
✅ 不再出现 TypeError: 'NoneType' object is not callable 异常

参考文档

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant