Skip to main content
Glama
CLAUDE_CODE_NOTIFICATION_DIAGNOSIS.md6.69 kB
# Claude Code Notification Issue - Root Cause Analysis **Date:** October 23, 2025 **Issue:** Claude Code does not display progress notifications during Stata execution **Status:** 🔍 **ROOT CAUSE IDENTIFIED** --- ## Investigation Summary ### ✅ What's Working 1. **Server correctly uses HTTP transport:** ``` 2025-10-23 19:32:07 - Using HTTP server request context 2025-10-23 19:32:07 - ✓ Streaming enabled via HTTP server - Tool: stata_run_file ``` 2. **Notifications ARE being sent:** ``` 2025-10-23 19:32:13 - MCP streaming log [notice]: ⏱️ 6s elapsed / 600s timeout 2025-10-23 19:32:13 - sse_starlette.sse - chunk: event: message data: {"method":"notifications/message","params":{"level":"notice","data":"⏱️ 6s elapsed..."}} ``` 3. **26+ notifications sent** during 72-second execution (every 6 seconds) ### ❌ What's NOT Working **Claude Code is not displaying the notifications** - but not because they aren't being sent! --- ## Root Cause ### Issue 1: No Progress Token Claude Code doesn't provide a `progressToken` in requests: ``` Tool execution - Server: HTTP, Session ID: None, Request ID: 2, Progress Token: None ^^^^^^^^^^^^^^^^ ``` Without a progress token, `send_progress_notification()` returns early and does nothing. ### Issue 2: Claude Code May Not Subscribe to Logging **Critical Finding:** Claude Code never sends `logging/setLevel` request! - Server registers the handler: ✅ ``` 2025-10-23 19:29:16 - Registering handler for SetLevelRequest ``` - Claude Code sends the request: ❌ (not found in logs) **This means Claude Code might not have a logging callback registered to receive notifications!** --- ## Comparison: MCP Python SDK vs Claude Code ### MCP Python SDK (✅ Works) ```python async def logging_callback(params): # Handle notification print(f"Notification: {params.data}") async with ClientSession( read_stream, write_stream, logging_callback=logging_callback # ← Explicitly registered ) as session: ... ``` **Result:** All 26 notifications received and displayed ### Claude Code (❌ Doesn't Work) - Uses HTTP Streamable transport: ✅ - Receives SSE stream: ✅ - Registers logging callback: ❓ (unknown - likely ❌) - Calls `logging/setLevel`: ❌ (not in logs) **Result:** Notifications sent but not displayed --- ## Technical Details ### Notification Flow 1. **Server sends notification:** ```python await session.send_log_message( level="notice", data="⏱️ 6s elapsed / 600s timeout", logger="stata-mcp", related_request_id=request_id ) ``` 2. **Notification packaged as SSE:** ``` event: message data: {"method":"notifications/message","params":{...}} ``` 3. **Sent via HTTP Streamable transport:** ``` sse_starlette.sse - chunk: b'event: message\r\ndata: {...}\r\n\r\n' ``` 4. **Client receives SSE event:** ✅ (network layer) 5. **Client processes notification:** ❌ (Claude Code doesn't handle it) --- ## Why Our Fix Worked for Python SDK But Not Claude Code ### Our Fix ```python # Check HTTP context first (not SSE) try: ctx = http_mcp_server.request_context # ✅ Now uses HTTP server_type = "HTTP" except (LookupError, NameError): # Fall back to SSE ctx = bound_self.server.request_context ``` **Effect:** - ✅ Notifications sent through correct transport (HTTP) - ✅ MCP Python SDK receives them (has `logging_callback`) - ❌ Claude Code doesn't display them (no `logging_callback`?) --- ## Recommended Solutions ### Option 1: Claude Code Needs to Register Logging Callback This is a **Claude Code client-side issue**. Claude Code needs to: 1. Register a `logging_callback` when creating the MCP session 2. Optionally send `logging/setLevel` request to enable server-side filtering **Example fix (in Claude Code's client code):** ```typescript const session = new Client({ // ... loggingCallback: (params) => { // Display notification in UI showNotification(params.level, params.data); } }); ``` ### Option 2: Use Progress Notifications Instead If Claude Code properly handles progress notifications, we could switch to those: **Server-side change:** ```python if progress_token: await session.send_progress_notification( progress_token=progress_token, progress=elapsed, total=timeout ) ``` **But:** Claude Code doesn't send `progressToken`, so this won't work either. ### Option 3: Report to Anthropic This appears to be a **Claude Code bug** - the client should either: 1. Register a logging callback, OR 2. Provide a progress token Without either, real-time notifications can't work. --- ## Testing Evidence ### Server Logs Prove Notifications Are Sent ``` 2025-10-23 19:32:07 - MCP streaming log: ▶️ Starting Stata execution 2025-10-23 19:32:13 - MCP streaming log: ⏱️ 6s elapsed / 600s timeout 2025-10-23 19:32:19 - MCP streaming log: ⏱️ 12s elapsed / 600s timeout ... (26 total notifications) 2025-10-23 19:33:19 - MCP streaming log: ✅ Execution completed in 72.0s ``` All sent via SSE chunks: ``` sse_starlette.sse - chunk: b'event: message\r\ndata: {"method":"notifications/message",... ``` ### MCP Python SDK Test Proves They Can Be Received ``` $ python test_mcp_client_notifications.py 📢 [0.0s] Log [notice]: ▶️ Starting Stata execution 📢 [2.0s] Log [notice]: ⏱️ 2s elapsed / 90s timeout ... (26 notifications) 📢 [72.1s] Log [notice]: ✅ Execution completed ✅ SUCCESS: Notifications were received by the MCP client! Total: 26 notifications ``` --- ## Conclusion **The server is working correctly.** Our fix ensures notifications are sent through the HTTP transport, and they ARE being sent. The MCP Python SDK proves they can be received. **The issue is in Claude Code's client implementation.** Claude Code either: 1. Doesn't register a logging callback to receive notifications, OR 2. Registers one but has a bug preventing display **Action Items:** 1. ✅ **Server-side:** Fixed and verified 2. ❌ **Client-side:** Needs fix in Claude Code 3. 📝 **Report to Anthropic:** File bug report about missing notification support **Workaround:** Until Claude Code is fixed, users can: - Monitor the log file directly - Use the web UI data viewer (if available) - Check Stata's own log files --- ## Files for Reference - **Server logs:** `/Users/hanlulong/.vscode/extensions/deepecon.stata-mcp-0.3.4/logs/stata_mcp_server.log` - **Test script:** `test_mcp_client_notifications.py` - **Test results:** `MCP_CLIENT_VERIFICATION_SUCCESS.md`

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/hanlulong/stata-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server