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