sendLog method

void sendLog(
  1. McpLogLevel level,
  2. String message, {
  3. String? logger,
  4. dynamic data,
})

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),
    });
  }
}