requestClientTask method

Future<Map<String, dynamic>> requestClientTask(
  1. String sessionId,
  2. String method,
  3. Map<String, dynamic> params, {
  4. int? ttl,
  5. Duration timeout = const Duration(seconds: 60),
})

2025-11-25, server as requestor: send method (sampling/createMessage or elicitation/create) to the client as a task. Only when the client declared tasks.requests for it. Returns the client's task; follow it with clientTaskGet / clientTaskResult / clientTaskCancel.

Implementation

Future<Map<String, dynamic>> requestClientTask(
  String sessionId,
  String method,
  Map<String, dynamic> params, {
  int? ttl,
  Duration timeout = const Duration(seconds: 60),
}) async {
  final session = _sessions[sessionId];
  if (session == null) throw StateError('Unknown sessionId: $sessionId');
  final requests = (session.capabilities?['tasks'] as Map?)?['requests'];
  final parts = method.split('/');
  final group = requests is Map ? requests[parts.first] : null;
  if (group is! Map || group[parts.last] == null) {
    throw McpError(
      'Client does not accept $method as a task',
      code: ErrorCode.invalidParams,
    );
  }
  final result = await _sendRequestToClient(sessionId, method, {
    ...params,
    'task': {if (ttl != null) 'ttl': ttl},
  }, timeout: timeout);
  final task = (result as Map)['task'];
  if (task is! Map) {
    throw McpError(
      'Client did not answer with a task',
      code: ErrorCode.internalError,
    );
  }
  return Map<String, dynamic>.from(task);
}