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