use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase")]
pub enum McpTransport {
#[default]
Stdio,
Http,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct StdioConfig {
#[serde(alias = "command")]
pub command: String,
#[serde(default, skip_serializing_if = "Vec::is_empty", alias = "args")]
pub args: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "cwd")]
pub cwd: Option<String>,
#[serde(default, skip_serializing_if = "HashMap::is_empty", alias = "env")]
pub env: HashMap<String, String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct HttpConfig {
#[serde(alias = "url")]
pub url: String,
#[serde(default, skip_serializing_if = "HashMap::is_empty", alias = "headers")]
pub headers: HashMap<String, String>,
}
fn default_true() -> bool {
true
}
fn default_timeout() -> u64 {
30
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct McpServerConfig {
#[serde(alias = "id")]
pub id: String,
#[serde(alias = "name")]
pub name: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "description"
)]
pub description: Option<String>,
#[serde(alias = "transport")]
pub transport: McpTransport,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "stdio_config"
)]
pub stdio_config: Option<StdioConfig>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "http_config"
)]
pub http_config: Option<HttpConfig>,
#[serde(default = "default_true", alias = "enabled")]
pub enabled: bool,
#[serde(default, alias = "auto_start")]
pub auto_start: bool,
#[serde(default = "default_timeout", alias = "timeout_seconds")]
pub timeout_seconds: u64,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "cached_tools"
)]
pub cached_tools: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "tools_cached_at"
)]
pub tools_cached_at: Option<String>,
#[serde(alias = "created_at")]
pub created_at: String,
#[serde(alias = "updated_at")]
pub updated_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct McpToolInputSchema {
#[serde(rename = "type", alias = "schema_type")]
pub schema_type: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "description"
)]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "properties")]
pub properties: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "required")]
pub required: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct McpToolInfo {
#[serde(alias = "name")]
pub name: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "description"
)]
pub description: Option<String>,
#[serde(alias = "input_schema")]
pub input_schema: McpToolInputSchema,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct McpServerStatus {
#[serde(alias = "server_id")]
pub server_id: String,
#[serde(alias = "connected")]
pub connected: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "error")]
pub error: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "tools")]
pub tools: Option<Vec<McpToolInfo>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "last_connect_attempt"
)]
pub last_connect_attempt: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "last_connected"
)]
pub last_connected: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct CreateMcpServerInput {
#[serde(alias = "name")]
pub name: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "description"
)]
pub description: Option<String>,
#[serde(alias = "transport")]
pub transport: McpTransport,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "stdio_config"
)]
pub stdio_config: Option<StdioConfig>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "http_config"
)]
pub http_config: Option<HttpConfig>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "enabled")]
pub enabled: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "auto_start")]
pub auto_start: Option<bool>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "timeout_seconds"
)]
pub timeout_seconds: Option<u64>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct UpdateMcpServerInput {
#[serde(default, skip_serializing_if = "Option::is_none", alias = "name")]
pub name: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "description"
)]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "transport")]
pub transport: Option<McpTransport>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "stdio_config"
)]
pub stdio_config: Option<StdioConfig>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "http_config"
)]
pub http_config: Option<HttpConfig>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "enabled")]
pub enabled: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "auto_start")]
pub auto_start: Option<bool>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "timeout_seconds"
)]
pub timeout_seconds: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct McpToolCallResult {
#[serde(alias = "success")]
pub success: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "content")]
pub content: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "error")]
pub error: Option<String>,
#[serde(alias = "response_type")]
pub response_type: String,
#[serde(alias = "duration_ms")]
pub duration_ms: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct CreateMcpCallInput {
#[serde(alias = "task_run_id")]
pub task_run_id: String,
#[serde(alias = "step_id")]
pub step_id: String,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "step_name")]
pub step_name: Option<String>,
#[serde(alias = "server_id")]
pub server_id: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "server_name"
)]
pub server_name: Option<String>,
#[serde(alias = "tool_name")]
pub tool_name: String,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "arguments")]
pub arguments: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "resolved_arguments"
)]
pub resolved_arguments: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "response")]
pub response: Option<String>,
#[serde(alias = "response_type")]
pub response_type: String,
#[serde(alias = "duration_ms")]
pub duration_ms: i64,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "extractions"
)]
pub extractions: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "assertions")]
pub assertions: Option<String>,
#[serde(alias = "success")]
pub success: bool,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "error_message"
)]
pub error_message: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct McpCallRecord {
#[serde(alias = "id")]
pub id: String,
#[serde(alias = "task_run_id")]
pub task_run_id: String,
#[serde(alias = "step_id")]
pub step_id: String,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "step_name")]
pub step_name: Option<String>,
#[serde(alias = "server_id")]
pub server_id: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "server_name"
)]
pub server_name: Option<String>,
#[serde(alias = "tool_name")]
pub tool_name: String,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "arguments")]
pub arguments: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "resolved_arguments"
)]
pub resolved_arguments: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "response")]
pub response: Option<String>,
#[serde(alias = "response_type")]
pub response_type: String,
#[serde(alias = "duration_ms")]
pub duration_ms: i64,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "extractions"
)]
pub extractions: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "assertions")]
pub assertions: Option<String>,
#[serde(alias = "success")]
pub success: bool,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "error_message"
)]
pub error_message: Option<String>,
#[serde(alias = "created_at")]
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct McpCallsResult {
#[serde(alias = "task_run_id")]
pub task_run_id: String,
#[serde(alias = "calls")]
pub calls: Vec<McpCallRecord>,
#[serde(alias = "count")]
pub count: usize,
#[serde(default, alias = "total_count")]
pub total_count: usize,
#[serde(alias = "success_count")]
pub success_count: usize,
#[serde(alias = "failed_count")]
pub failed_count: usize,
#[serde(default, alias = "has_more")]
pub has_more: bool,
}