use std::collections::HashMap;
use http::{HeaderName, HeaderValue};
use systemprompt_models::RequestContext;
use systemprompt_models::mcp::McpServerConfig;
use super::McpClient;
use crate::error::{McpDomainError, McpDomainResult};
#[derive(Debug)]
pub struct ExternalProxyTarget {
pub url: String,
pub headers: HashMap<HeaderName, HeaderValue>,
}
impl McpClient {
pub async fn resolve_external_proxy_target(
server_config: &McpServerConfig,
context: &RequestContext,
) -> McpDomainResult<ExternalProxyTarget> {
let ext = server_config.external_auth.as_ref().ok_or_else(|| {
McpDomainError::Configuration(format!(
"MCP server '{}' has no external_auth accessor to mint a per-user bearer",
server_config.name
))
})?;
let bearer =
super::external_auth::resolve_external_bearer(ext, context, &server_config.name)
.await?;
let headers = super::external_auth::outbound_headers(
ext,
&bearer,
&server_config.headers,
&server_config.name,
)?;
Ok(ExternalProxyTarget {
url: server_config.remote_endpoint.clone(),
headers,
})
}
}