send method
Send a message through the transport
Implementation
@override
void send(dynamic message) async {
if (_isClosed) {
_logger.debug('Attempted to send on closed transport');
return;
}
if (_messageEndpoint == null) {
throw McpError(
'Cannot send message: SSE connection not fully established',
);
}
try {
final jsonMessage = jsonEncode(message);
_logger.debug('Sending message: $jsonMessage');
final url = Uri.parse(_messageEndpoint!);
final client = HttpClient();
final request = await client.postUrl(url);
// Set headers
request.headers.contentType = ContentType.json;
if (headers != null) {
headers!.forEach((name, value) {
request.headers.add(name, value);
});
}
// Send the request
request.write(jsonMessage);
final response = await request.close();
// Check for successful delivery (200 OK or 202 Accepted)
if (response.statusCode == 200 || response.statusCode == 202) {
final responseBody = await response.transform(utf8.decoder).join();
_logger.debug(
'Message delivery confirmation (${response.statusCode}): $responseBody',
);
// Don't forward this to message controller, actual response comes via SSE
} else {
final responseBody = await response.transform(utf8.decoder).join();
_logger.debug('Error response: $responseBody');
throw McpError('Error sending message: ${response.statusCode}');
}
// Close the HTTP client
client.close();
_logger.debug('Message sent successfully');
} catch (e) {
_logger.debug('Error sending message: $e');
rethrow;
}
}