send method

  1. @override
Future<void> send(
  1. Map<String, dynamic> message
)
override

Sends one JSON-RPC message. For HTTP transports the returned future settles once the message was POSTed (transport-level failures are delivered as synthetic error responses on messages when the message was a request).

Implementation

@override
Future<void> send(Map<String, dynamic> message) async {
  if (_closed.isCompleted) return;
  final request = http.Request('POST', Uri.parse(_server.url));
  request.headers.addAll({
    ..._server.headers,
    'content-type': 'application/json',
    'accept': 'application/json, text/event-stream',
    'mcp-session-id': ?_sessionId,
  });
  request.body = jsonEncode(message);
  final http.StreamedResponse response;
  try {
    response = await _client.send(request);
  } on Object catch (error) {
    emitTransportError(message['id'], 'MCP HTTP request failed: $error');
    return;
  }
  _sessionId ??= response.headers['mcp-session-id'];
  if (response.statusCode == 202 || response.statusCode == 204) {
    return; // notification/response accepted, no body
  }
  if (response.statusCode >= 400) {
    await _failWithBody(message['id'], response);
    return;
  }
  final contentType = response.headers['content-type'] ?? '';
  if (contentType.contains('text/event-stream')) {
    await _consumeSseBody(response.stream);
  } else {
    await _consumeJsonBody(response.stream);
  }
}