diff --git a/crates/goose/src/agents/extension_manager.rs b/crates/goose/src/agents/extension_manager.rs index b95e990d..029c7b2e 100644 --- a/crates/goose/src/agents/extension_manager.rs +++ b/crates/goose/src/agents/extension_manager.rs @@ -363,6 +363,9 @@ fn substitute_env_vars(value: &str, env_map: &HashMap) -> String result } +const GOOSE_USER_AGENT: reqwest::header::HeaderValue = + reqwest::header::HeaderValue::from_static(concat!("goose/", env!("CARGO_PKG_VERSION"))); + async fn create_streamable_http_client( uri: &str, timeout: Option, @@ -372,6 +375,9 @@ async fn create_streamable_http_client( provider: SharedProvider, ) -> ExtensionResult> { let mut default_headers = HeaderMap::new(); + + default_headers.insert(reqwest::header::USER_AGENT, GOOSE_USER_AGENT); + for (key, value) in headers { let substituted_value = substitute_env_vars(value, all_envs); default_headers.insert( @@ -405,7 +411,15 @@ async fn create_streamable_http_client( let am = oauth_flow(&uri.to_string(), &name.to_string()) .await .map_err(|_| ExtensionError::SetupError("auth error".to_string()))?; - let auth_client = AuthClient::new(reqwest::Client::default(), am); + let mut auth_headers = HeaderMap::new(); + auth_headers.insert(reqwest::header::USER_AGENT, GOOSE_USER_AGENT); + let auth_http_client = reqwest::Client::builder() + .default_headers(auth_headers) + .build() + .map_err(|_| { + ExtensionError::ConfigError("could not construct http client".to_string()) + })?; + let auth_client = AuthClient::new(auth_http_client, am); let transport = StreamableHttpClientTransport::with_client( auth_client, StreamableHttpClientTransportConfig {