Skip to content

Commit 536fad8

Browse files
committed
modifies server init process to accommodate for different transport type
1 parent 9f0078d commit 536fad8

File tree

8 files changed

+532
-42
lines changed

8 files changed

+532
-42
lines changed

crates/chat-cli/src/cli/chat/server_messenger.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ pub enum UpdateEventMessage {
4444
result: Result<ListResourceTemplatesResult>,
4545
peer: Option<Peer<RoleClient>>,
4646
},
47+
OauthLink {
48+
server_name: String,
49+
link: String,
50+
},
4751
InitStart {
4852
server_name: String,
4953
},
@@ -146,6 +150,17 @@ impl Messenger for ServerMessenger {
146150
.map_err(|e| MessengerError::Custom(e.to_string()))?)
147151
}
148152

153+
async fn send_oauth_link(&self, link: String) -> MessengerResult {
154+
Ok(self
155+
.update_event_sender
156+
.send(UpdateEventMessage::OauthLink {
157+
server_name: self.server_name.clone(),
158+
link,
159+
})
160+
.await
161+
.map_err(|e| MessengerError::Custom(e.to_string()))?)
162+
}
163+
149164
async fn send_init_msg(&self) -> MessengerResult {
150165
Ok(self
151166
.update_event_sender

crates/chat-cli/src/cli/chat/tool_manager.rs

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -630,19 +630,25 @@ impl ToolManager {
630630
let server_name_clone = server_name.clone();
631631
tokio::spawn(async move {
632632
match handle.await {
633-
Ok(Ok(client)) => match client.cancel().await {
634-
Ok(_) => info!("Server {server_name_clone} evicted due to agent swap"),
635-
Err(e) => error!("Server {server_name_clone} has failed to cancel: {e}"),
633+
Ok(Ok(client)) => {
634+
let client = client.inner_service;
635+
match client.cancel().await {
636+
Ok(_) => info!("Server {server_name_clone} evicted due to agent swap"),
637+
Err(e) => error!("Server {server_name_clone} has failed to cancel: {e}"),
638+
}
636639
},
637640
Ok(Err(_)) | Err(_) => {
638641
error!("Server {server_name_clone} has failed to cancel");
639642
},
640643
}
641644
});
642645
},
643-
InitializedMcpClient::Ready(running_service) => match running_service.cancel().await {
644-
Ok(_) => info!("Server {server_name} evicted due to agent swap"),
645-
Err(e) => error!("Server {server_name} has failed to cancel: {e}"),
646+
InitializedMcpClient::Ready(running_service) => {
647+
let client = running_service.inner_service;
648+
match client.cancel().await {
649+
Ok(_) => info!("Server {server_name} evicted due to agent swap"),
650+
Err(e) => error!("Server {server_name} has failed to cancel: {e}"),
651+
}
646652
},
647653
}
648654
}
@@ -1595,6 +1601,37 @@ fn spawn_orchestrator_task(
15951601
},
15961602
UpdateEventMessage::ListResourcesResult { .. } => {},
15971603
UpdateEventMessage::ResourceTemplatesListResult { .. } => {},
1604+
UpdateEventMessage::OauthLink { server_name, link } => {
1605+
let mut buf_writer = BufWriter::new(&mut *record_temp_buf);
1606+
let msg = eyre::eyre!(link);
1607+
let _ = queue_oauth_message(server_name.as_str(), &msg, &mut buf_writer);
1608+
let _ = buf_writer.flush();
1609+
drop(buf_writer);
1610+
let record_str = String::from_utf8_lossy(record_temp_buf).to_string();
1611+
let record = LoadingRecord::Warn(record_str.clone());
1612+
load_record
1613+
.lock()
1614+
.await
1615+
.entry(server_name.clone())
1616+
.and_modify(|load_record| {
1617+
load_record.push(record.clone());
1618+
})
1619+
.or_insert(vec![record]);
1620+
if let Some(sender) = &loading_status_sender {
1621+
let msg = LoadingMsg::Warn {
1622+
name: server_name.clone(),
1623+
msg: eyre::eyre!("{}", record_str),
1624+
time: "0.0".to_string(),
1625+
};
1626+
if let Err(e) = sender.send(msg).await {
1627+
warn!(
1628+
"Error sending update message to display task: {:?}\nAssume display task has completed",
1629+
e
1630+
);
1631+
loading_status_sender.take();
1632+
}
1633+
}
1634+
},
15981635
UpdateEventMessage::InitStart { server_name, .. } => {
15991636
pending.write().await.insert(server_name.clone());
16001637
loading_servers.insert(server_name, std::time::Instant::now());
@@ -1876,6 +1913,21 @@ fn queue_failure_message(
18761913
)?)
18771914
}
18781915

1916+
fn queue_oauth_message(name: &str, msg: &eyre::Report, output: &mut impl Write) -> eyre::Result<()> {
1917+
Ok(queue!(
1918+
output,
1919+
style::SetForegroundColor(style::Color::Yellow),
1920+
style::Print("⚠ "),
1921+
style::SetForegroundColor(style::Color::Blue),
1922+
style::Print(name),
1923+
style::ResetColor,
1924+
style::Print(" requires OAuth authentication. Please visit:\n"),
1925+
style::SetForegroundColor(style::Color::Cyan),
1926+
style::Print(msg),
1927+
style::ResetColor,
1928+
)?)
1929+
}
1930+
18791931
fn queue_warn_message(name: &str, msg: &eyre::Report, time: &str, output: &mut impl Write) -> eyre::Result<()> {
18801932
Ok(queue!(
18811933
output,

crates/chat-cli/src/cli/chat/tools/custom_tool.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,8 @@ use crate::util::MCP_SERVER_TOOL_DELIMITER;
2828
use crate::util::pattern_matching::matches_any_pattern;
2929

3030
#[derive(Clone, Serialize, Deserialize, Debug, Eq, PartialEq, JsonSchema)]
31+
#[serde(rename_all = "camelCase")]
3132
pub enum TransportType {
32-
/// Server-Sent Events transport for real-time communication
33-
Sse,
3433
/// Standard input/output transport (default)
3534
Stdio,
3635
/// HTTP transport for web-based communication
@@ -48,6 +47,12 @@ pub struct CustomToolConfig {
4847
/// The type of transport the mcp server is expecting
4948
#[serde(default)]
5049
pub r#type: TransportType,
50+
/// The URL endpoint for HTTP-based MCP servers
51+
#[serde(default)]
52+
pub url: String,
53+
/// HTTP headers to include when communicating with HTTP-based MCP servers
54+
#[serde(default)]
55+
pub headers: HashMap<String, String>,
5156
/// The command string used to initialize the mcp server
5257
#[serde(default)]
5358
pub command: String,

0 commit comments

Comments
 (0)