requestClientTask method
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);
}