(&self, server_name: &str)
| 150 | } |
| 151 | |
| 152 | pub async fn connect(&self, server_name: &str) -> Result<McpServerInfo, McpOAuthError> { |
| 153 | self.log_event(server_name, "info", "Connect requested") |
| 154 | .await; |
| 155 | let managed = self.managed_server(server_name).await?; |
| 156 | let oauth_status = self.oauth_status_for(server_name).await; |
| 157 | let oauth_required = managed.config.oauth_required(); |
| 158 | |
| 159 | if !managed.enabled { |
| 160 | let info = McpServerInfo { |
| 161 | name: server_name.to_string(), |
| 162 | status: "disabled".to_string(), |
| 163 | tools: 0, |
| 164 | resources: 0, |
| 165 | error: None, |
| 166 | oauth_required, |
| 167 | oauth_status, |
| 168 | }; |
| 169 | self.statuses |
| 170 | .write() |
| 171 | .await |
| 172 | .insert(server_name.to_string(), info.clone()); |
| 173 | self.log_event(server_name, "info", "Server is disabled") |
| 174 | .await; |
| 175 | return Ok(info); |
| 176 | } |
| 177 | |
| 178 | let info = match managed.config { |
| 179 | McpRuntimeConfig::Local(local) => { |
| 180 | if let Err(error) = self.clients.remove(server_name).await { |
| 181 | tracing::warn!(server = server_name, %error, "failed to remove existing MCP client"); |
| 182 | } |
| 183 | |
| 184 | let env = local |
| 185 | .env |
| 186 | .map(|map| map.into_iter().collect::<Vec<(String, String)>>()); |
| 187 | |
| 188 | match self |
| 189 | .clients |
| 190 | .add_client(McpClientConfig { |
| 191 | name: server_name.to_string(), |
| 192 | command: local.command, |
| 193 | args: local.args, |
| 194 | env, |
| 195 | timeout_ms: local.timeout, |
| 196 | }) |
| 197 | .await |
| 198 | { |
| 199 | Ok(_) => { |
| 200 | let tool_count = self |
| 201 | .clients |
| 202 | .tool_registry() |
| 203 | .list_for_server(server_name) |
| 204 | .await |
| 205 | .len(); |
| 206 | self.log_event(server_name, "info", "Connected local MCP server") |
| 207 | .await; |
| 208 | McpServerInfo { |
| 209 | name: server_name.to_string(), |
no test coverage detected