feat: 添加 HTTP 传输连接支持,优化 MCP 客户端管理器
This commit is contained in:
parent
cbb384a4e6
commit
b3fa0bb978
@ -45,3 +45,4 @@ rmcp = { git = "https://github.com/modelcontextprotocol/rust-sdk", branch = "mai
|
|||||||
"reqwest",
|
"reqwest",
|
||||||
] }
|
] }
|
||||||
schemars = "1.0"
|
schemars = "1.0"
|
||||||
|
http = "1"
|
||||||
|
|||||||
@ -9,7 +9,9 @@ use rmcp::{
|
|||||||
RoleClient, ServiceExt,
|
RoleClient, ServiceExt,
|
||||||
service::RunningService,
|
service::RunningService,
|
||||||
transport::TokioChildProcess,
|
transport::TokioChildProcess,
|
||||||
|
transport::streamable_http_client::{StreamableHttpClientTransport, StreamableHttpClientTransportConfig},
|
||||||
};
|
};
|
||||||
|
use http::{HeaderName, HeaderValue};
|
||||||
use tokio::process::Command;
|
use tokio::process::Command;
|
||||||
|
|
||||||
use crate::mcp::config::{McpServerConfig, McpTransportConfig};
|
use crate::mcp::config::{McpServerConfig, McpTransportConfig};
|
||||||
@ -81,14 +83,8 @@ impl McpClientManager {
|
|||||||
McpTransportConfig::Stdio { command, args, env } => {
|
McpTransportConfig::Stdio { command, args, env } => {
|
||||||
self.connect_stdio(command, args, env).await?
|
self.connect_stdio(command, args, env).await?
|
||||||
}
|
}
|
||||||
McpTransportConfig::Http { url, headers: _ } => {
|
McpTransportConfig::Http { url, headers } => {
|
||||||
// HTTP transport requires additional setup
|
self.connect_http(url, headers).await?
|
||||||
// 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
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -117,7 +113,7 @@ impl McpClientManager {
|
|||||||
Ok(server_info)
|
Ok(server_info)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Connect via stdio transport
|
/// Connect via stdio transport (spawn child process)
|
||||||
async fn connect_stdio(
|
async fn connect_stdio(
|
||||||
&self,
|
&self,
|
||||||
command: &str,
|
command: &str,
|
||||||
@ -140,6 +136,43 @@ impl McpClientManager {
|
|||||||
Ok(client)
|
Ok(client)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Connect via HTTP transport (Streamable HTTP)
|
||||||
|
async fn connect_http(
|
||||||
|
&self,
|
||||||
|
url: &str,
|
||||||
|
headers: &HashMap<String, String>,
|
||||||
|
) -> anyhow::Result<McpClient> {
|
||||||
|
// Build custom headers
|
||||||
|
let custom_headers: HashMap<HeaderName, HeaderValue> = 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
|
/// Get a client by server name
|
||||||
pub async fn get_client(&self, name: &str) -> Option<Arc<McpClient>> {
|
pub async fn get_client(&self, name: &str) -> Option<Arc<McpClient>> {
|
||||||
let clients = self.clients.read().await;
|
let clients = self.clients.read().await;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user