Surface MCP server notifications/message as conversation interjections
Summary
MCP servers can send unsolicited notifications/message to clients at any time via the standard MCP protocol. Claude Code currently does not surface these as conversation messages/interjections, which means server-push patterns (watchers, background jobs, progress updates) are invisible to the user when using Claude Code as the MCP client.
Use case
We built a watch_notebook tool on a Snowflake Snowsight Notebook MCP server. The tool:
- Captures a baseline notebook state
- Spawns a background Tokio task that polls for changes
- On each change, calls
peer.send_notification(ServerNotification::from(LoggingMessageNotification {...}))— fully standard MCPnotifications/message - Returns immediately to the caller
This works correctly for any MCP client that handles notifications/message. In Claude Code, the tool returns immediately (✅) but the subsequent notifications are silently dropped — the user never sees the change events.
Expected behavior
When an MCP server sends a notifications/message, Claude Code should inject it into the active conversation, similar to how <task-notification> tags surface background bash task completions today. The notification level (info, warning, error) could map to visual treatment.
Current workaround
None within Claude Code. The only alternative is writing to a log file and running a separate bash background task to poll it — which defeats the purpose of having a push-capable MCP server.
References
- MCP spec:
notifications/message— https://spec.modelcontextprotocol.io/specification/server/utilities/logging/ - rmcp 1.5
Peer::send_notification()is the server-side API used <task-notification>is the existing Claude Code mechanism for background task interjections (bash tasks only)
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗