From b3fa0bb978a0bebc876385f9ba86b8562f306ab2 Mon Sep 17 00:00:00 2001 From: ooodc <549496103@qq.com> Date: Sat, 23 May 2026 22:57:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20HTTP=20=E4=BC=A0?= =?UTF-8?q?=E8=BE=93=E8=BF=9E=E6=8E=A5=E6=94=AF=E6=8C=81=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20MCP=20=E5=AE=A2=E6=88=B7=E7=AB=AF=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 1 + src/mcp/client.rs | 51 ++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6262e3f..576f014 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,3 +45,4 @@ rmcp = { git = "https://github.com/modelcontextprotocol/rust-sdk", branch = "mai "reqwest", ] } schemars = "1.0" +http = "1" diff --git a/src/mcp/client.rs b/src/mcp/client.rs index 7d60f48..72a79e3 100644 --- a/src/mcp/client.rs +++ b/src/mcp/client.rs @@ -9,7 +9,9 @@ use rmcp::{ RoleClient, ServiceExt, service::RunningService, transport::TokioChildProcess, + transport::streamable_http_client::{StreamableHttpClientTransport, StreamableHttpClientTransportConfig}, }; +use http::{HeaderName, HeaderValue}; use tokio::process::Command; use crate::mcp::config::{McpServerConfig, McpTransportConfig}; @@ -81,14 +83,8 @@ impl McpClientManager { McpTransportConfig::Stdio { command, args, env } => { self.connect_stdio(command, args, env).await? } - McpTransportConfig::Http { url, headers: _ } => { - // HTTP transport requires additional setup - // For now, we'll return an error for HTTP transport - return Err(anyhow::anyhow!( - "HTTP transport for MCP server '{}' is not yet implemented. URL: {}", - config.name, - url - )); + McpTransportConfig::Http { url, headers } => { + self.connect_http(url, headers).await? } }; @@ -117,7 +113,7 @@ impl McpClientManager { Ok(server_info) } - /// Connect via stdio transport + /// Connect via stdio transport (spawn child process) async fn connect_stdio( &self, command: &str, @@ -140,6 +136,43 @@ impl McpClientManager { Ok(client) } + /// Connect via HTTP transport (Streamable HTTP) + async fn connect_http( + &self, + url: &str, + headers: &HashMap, + ) -> anyhow::Result { + // Build custom headers + let custom_headers: HashMap = headers + .iter() + .filter_map(|(key, value)| { + // Try to parse header name and value + HeaderName::try_from(key.clone()) + .ok() + .and_then(|name| { + HeaderValue::try_from(value.clone()) + .ok() + .map(|val| (name, val)) + }) + }) + .collect(); + + // Create transport config with custom headers + let config = StreamableHttpClientTransportConfig::with_uri(url) + .custom_headers(custom_headers); + + // Create transport using reqwest client (default) + let transport = StreamableHttpClientTransport::with_client( + reqwest::Client::default(), + config, + ); + + // Connect + let client = ().serve(transport).await?; + + Ok(client) + } + /// Get a client by server name pub async fn get_client(&self, name: &str) -> Option> { let clients = self.clients.read().await;