initialize method

Future<void> initialize()

Initialize the connection to the server

Implementation

Future<void> initialize() async {
  if (_initialized) {
    throw McpError('Client is already initialized');
  }

  if (!isConnected) {
    throw McpError('Client is not connected to a transport');
  }

  final response = await _sendRequest('initialize', {
    'protocolVersion': protocolVersion,
    'clientInfo': {'name': name, 'version': version},
    'capabilities': capabilities.toJson(),
  });

  if (response == null) {
    throw McpError('Failed to initialize: No response from server');
  }

  final serverProtoVersion = response['protocolVersion'];
  if (serverProtoVersion != protocolVersion) {
    _validateProtocolVersion(serverProtoVersion);
  }

  _serverInfo = response['serverInfo'];
  final capabilitiesData = response['capabilities'];
  _serverCapabilities = ServerCapabilities.fromJson(
    capabilitiesData != null
        ? Map<String, dynamic>.from(capabilitiesData as Map)
        : {},
  );

  // Capture the negotiated revision and inform the transport so HTTP
  // implementations can stamp `MCP-Protocol-Version: <version>` on
  // every post-handshake request (spec 2025-06-18+).
  if (serverProtoVersion is String) {
    _negotiatedProtocolVersion = serverProtoVersion;
    // HTTP transports attach `MCP-Protocol-Version` to subsequent
    // requests when the negotiated revision is 2025-06-18+. Other
    // transports (stdio / SSE) ignore the header so we only forward
    // when the concrete transport exposes the setter.
    final tx = _transport;
    if (tx is StreamableHttpClientTransport) {
      tx.setProtocolVersion(serverProtoVersion);
    }
  }

  // Send initialized notification
  _sendNotification('notifications/initialized', {});

  _initialized = true;
  _logger.debug('Initialization complete');
}