sendLog method
Send a logging notification to the client
Logging (server/utilities/logging): sent only when the logging
capability is declared, and only at or above the level the client chose.
Before 2026-07-28 the level is the session's (logging/setLevel); inside
a 2026-07-28 request it is that request's _meta logLevel, the
notification belongs to that request alone, and a request without one
gets none. Called inside a request, it reaches that request's client
only; outside, every session on a revision before 2026-07-28.
Implementation
void sendLog(
McpLogLevel level,
String message, {
String? logger,
dynamic data,
}) {
if (!isConnected || capabilities.logging == null) return;
final levelString = level.name;
final params = <String, dynamic>{
'level': levelString,
if (logger != null) 'logger': logger,
};
final logData = <String, dynamic>{'message': message};
if (data != null) {
if (data is Map<String, dynamic>) {
logData.addAll(data);
} else {
logData['additional'] = data;
}
}
params['data'] = logData;
final requestSession = Zone.current[#mcpRequestSession] as String?;
final targets =
requestSession != null
? [if (_sessions[requestSession] case final s?) s]
: _sessions.values.where((s) => !s.isStateless).toList();
for (final session in targets) {
final minimum =
session.isStateless
? McpRequestMeta.readLogLevel(McpRequestMeta.current)
: (session.logLevel ?? 'debug');
if (minimum == null || _logRank(levelString) < _logRank(minimum)) {
continue;
}
session.transport.send({
'jsonrpc': '2.0',
'method': 'notifications/message',
'params': _withRelatedTask('notifications/message', params),
'_targetSessionId': session.id,
..._relatedRequest(session.id),
});
}
}