poll method

Future<List<McpSseEvent>> poll({
  1. String? lastEventId,
  2. Map<String, String> headers = const <String, String>{},
})

Polls pending Streamable HTTP events for the active session.

Implementation

Future<List<McpSseEvent>> poll({
  String? lastEventId,
  Map<String, String> headers = const <String, String>{},
}) async {
  if (protocolVersion == latestProtocolVersion) {
    throw const McpStreamableProtocolException(
      'MCP 2026 HTTP does not support GET polling',
    );
  }
  return _runTrackedHttpOperation<List<McpSseEvent>>((operation) async {
    final requestSessionState = _sessionStateSnapshot;
    final requestAuthorizationState = _authorizationStateSnapshot;
    final requestResumeState = _resumeStateSnapshot;
    final requestProtocolVersion = protocolVersion;
    final requestLastEventId = lastEventId ?? requestResumeState.lastEventId;
    final request = await _openTrackedHttpRequest(
      () => _httpClient.getUrl(endpoint),
      operation,
      requestAuthorizationState,
    );
    _applyHeaders(
      request,
      accept: _acceptSse,
      lastEventId: requestLastEventId,
      protocolVersion: requestProtocolVersion,
      sessionState: requestSessionState,
      authorizationState: requestAuthorizationState,
      extraHeaders: headers,
    );

    final response = await _sendTrackedHttpRequest(request, operation);
    final body = await _readTrackedHttpResponseBody(
      request,
      response,
      operation,
    );
    _throwIfHttpErrorForSession(
      response,
      body,
      expectedSessionToken: requestSessionState.token,
      expectedAuthorizationToken: requestAuthorizationState.token,
    );

    if (!_isSse(response)) {
      throw FormatException(
        'Expected $_acceptSse response, got ${response.headers.contentType?.mimeType ?? 'unknown'}',
      );
    }

    final events = parseMcpSseEvents(body);
    for (final event in events) {
      final value = event.jsonValue;
      if (value != null) {
        _validateJsonRpcSseMessageValue(value);
      }
    }
    _validateMcpSseEventIds(events);
    final ownsSessionState = identical(
      _sessionStateToken,
      requestSessionState.token,
    );
    _captureSessionHeaders(
      response,
      captureSessionState: ownsSessionState,
      expectedSessionState: requestSessionState,
      expectedProtocolVersion: requestProtocolVersion,
    );
    if (ownsSessionState) {
      _captureLastEventId(
        events,
        expectedResumeToken: requestResumeState.token,
      );
    }
    return events;
  });
}