use serde::Deserialize;
use std::path::PathBuf;
#[derive(Debug, Deserialize)]
#[serde(default)]
pub struct AkeylessMcpConfig {
pub api_url: String,
pub api_key_file: PathBuf,
}
impl Default for AkeylessMcpConfig {
fn default() -> Self {
let home = std::env::var("HOME").unwrap_or_else(|_| "/tmp".into());
Self {
api_url: "https://api.akeyless.io".into(),
api_key_file: PathBuf::from(&home).join(".config/akeyless_mcp/api-key"),
}
}
}
impl AkeylessMcpConfig {
pub fn load() -> Self {
let home = std::env::var("HOME").unwrap_or_else(|_| "/tmp".into());
let candidates: Vec<PathBuf> = [
std::env::var("AKEYLESS_MCP_CONFIG").map(PathBuf::from).ok(),
std::env::var("XDG_CONFIG_HOME")
.map(|x| PathBuf::from(x).join("akeyless_mcp/akeyless_mcp.yaml"))
.ok(),
Some(PathBuf::from(&home).join(".config/akeyless_mcp/akeyless_mcp.yaml")),
]
.into_iter()
.flatten()
.collect();
for candidate in &candidates {
if candidate.exists() {
if let Ok(content) = std::fs::read_to_string(candidate) {
match serde_yaml_ng::from_str::<Self>(&content) {
Ok(config) => return config,
Err(e) => {
tracing::warn!("failed to parse {}: {e}", candidate.display());
}
}
}
}
}
Self::default()
}
}