MCPcopy Create free account
hub / github.com/aws/amazon-q-developer-cli / init

Method init

crates/chat-cli/src/mcp_client/client.rs:285–380  ·  view source on GitHub ↗
(self, os: &Os)

Source from the content-addressed store, hash-verified

283 }
284
285 pub async fn init(self, os: &Os) -> Result<InitializedMcpClient, McpClientError> {
286 let os_clone = os.clone();
287
288 let handle: JoinHandle<Result<RunningService, McpClientError>> = tokio::spawn(async move {
289 let messenger_clone = self.messenger.clone();
290 let server_name = self.server_name.clone();
291
292 let (service, child_stderr, auth_dropguard) = match self.into_service(&os_clone, &messenger_clone).await {
293 Ok((service, stderr, auth_dg)) => (service, stderr, auth_dg),
294 Err(e) => {
295 let msg = e.to_string();
296 let error_data = ErrorData {
297 code: ErrorCode::RESOURCE_NOT_FOUND,
298 message: Cow::from(msg),
299 data: None,
300 };
301 let err = ServiceError::McpError(error_data);
302
303 if let Err(send_err) = messenger_clone.send_tools_list_result(Err(err), None).await {
304 error!("Error sending tool result for {server_name}: {send_err}");
305 }
306
307 return Err(e);
308 },
309 };
310
311 if let Some(mut stderr) = child_stderr {
312 let server_name_clone = server_name.clone();
313 tokio::spawn(async move {
314 let mut buf = [0u8; 1024];
315 loop {
316 match stderr.read(&mut buf).await {
317 Ok(0) => {
318 tracing::info!(target: "mcp", "{server_name_clone} stderr listening process exited due to EOF");
319 break;
320 },
321 Ok(size) => {
322 tracing::info!(target: "mcp", "{server_name_clone} logged to its stderr: {}", String::from_utf8_lossy(&buf[0..size]));
323 },
324 Err(e) => {
325 tracing::info!(target: "mcp", "{server_name_clone} stderr listening process exited due to error: {e}");
326 break; // Error reading
327 },
328 }
329 }
330 });
331 }
332
333 let service_clone = service.clone();
334 tokio::spawn(async move {
335 let result: Result<(), Box<dyn std::error::Error + Send + Sync>> = async {
336 let init_result = service_clone.peer_info();
337 if let Some(init_result) = init_result {
338 if init_result.capabilities.tools.is_some() {
339 paginated_fetch! {
340 final_result_type: ListToolsResult,
341 content_type: rmcp::model::Tool,
342 service_method: list_tools,

Callers 3

initialize_loggingFunction · 0.45
buildMethod · 0.45
setup_loggingMethod · 0.45

Calls 5

into_serviceMethod · 0.80
to_stringMethod · 0.80
readMethod · 0.80
cloneMethod · 0.45

Tested by

no test coverage detected