use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct McpServer {
pub id: String,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deployment_id: String,
pub name: String,
pub config: McpServerConfig,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct McpServerConfig {
pub endpoint: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub auth: Option<McpAuthConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<BTreeMap<String, String>>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum McpAuthConfig {
Token {
auth_token: String,
},
OAuthClientCredentials {
client_id: String,
client_secret: String,
#[serde(skip_serializing_if = "Option::is_none")]
token_url: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
scopes: Vec<String>,
},
OAuthAuthorizationCodePublicPkce {
#[serde(skip_serializing_if = "Option::is_none")]
client_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
auth_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
token_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
register_url: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
scopes: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
resource: Option<String>,
},
OAuthAuthorizationCodeConfidentialPkce {
client_id: String,
client_secret: String,
#[serde(skip_serializing_if = "Option::is_none")]
auth_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
token_url: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
scopes: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
resource: Option<String>,
},
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct CreateMcpServerRequest {
pub name: String,
pub config: McpServerConfig,
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct UpdateMcpServerRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub config: Option<McpServerConfig>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct McpServerDiscoveryResponse {
pub requires_auth: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub recommended_auth_mode: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub token_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub auth_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub register_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource_metadata_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub scopes: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub token_endpoint_auth_methods_supported: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub authorization_servers: Vec<String>,
pub message: String,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct McpServerCreateResponse {
#[serde(flatten)]
pub server: McpServer,
pub discovery_result: McpServerDiscoveryResponse,
}