Subscriptions
resources/subscribe over SSE. Push notifications when child state changes. The push half of the protocol.
The push half of the protocol. Lives on the same MCP connection as your tool calls. Your home agent calls resources/subscribe, the server upgrades the response to SSE, and pushes a notifications/resources/updated JSON-RPC frame whenever the subscribed resource changes.
Some resources are available today. Others are coming soon. Each gets its own page below.
Subscribable resources
screentime/requests
sprout://child/{childId}/screentime/requests: pending and recently-resolved screen-time unlock requests. Livegems
sprout://child/{childId}/gems: current balance and latest transactions. LiveSoontoday
sprout://child/{childId}/today: the kid's today view. Pushes on task land, complete, review.Soonactivity
sprout://family/activity: family-wide event stream. The resource that makes event-driven heartbeats real.How it works
- Your agent issues
resources/subscribewith a URI. - The server upgrades that HTTP response to SSE; the connection stays open.
- On every state change, the server emits
{ "jsonrpc": "2.0", "method": "notifications/resources/updated", "params": { "uri": "<uri>" } }. - Your agent reacts. Typical pattern:
resources/read <uri>to fetch the current state. resources/unsubscribecloses the stream cleanly.
One MCP connection can hold many subscriptions. Notifications interleave on the same stream; demultiplex by params.uri.
Delivery semantics
Apply across every subscribable resource.
- Latency: ~1 second from server-side change to client push.
- Ordering: per-URI, frames arrive in the order changes were applied.
- Duplicates: rare but possible across reconnects. Treat each notification as a hint to re-read, not as the truth itself.
- Backpressure: if your client falls behind, the server drops the connection; reconnect and re-subscribe.
- Reconnect:
resources/unsubscribeis best practice but not required. Dropped connections free their server-side subscriptions automatically. - State after notify: the notification only names the URI; the new state is fetched via
resources/read <uri>. Keeps push frames small and lets the read shape evolve independently.
Errors
PERMISSION_DENIED: token missing the scope required to read the underlying resource. Subscriptions are gated by the read scope of the URI.DOMAIN_NOT_FOUND: URI references a child / family not in scope of this token.BAD_INPUT: malformed URI or unknown resource template.INTERNAL_ERROR: server-side fault. Reconnect with backoff.
See also
- Model: Pull, push, realtime: where subscriptions sit in the protocol model.
- Model: Activity: consumer of the planned family/activity push.
- Model: Heartbeat: the event-driven trigger the activity push enables.
Was this page helpful?