use anda_core::BoxError;
use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(default)]
pub struct McpLimits {
pub catalog_pages: usize,
pub catalog_items: usize,
pub cursor_bytes: usize,
pub schema_bytes: usize,
pub description_bytes: usize,
pub server_metadata_bytes: usize,
pub message_bytes: usize,
pub output_text_bytes: usize,
pub output_media_bytes: usize,
pub output_media_items: usize,
}
impl Default for McpLimits {
fn default() -> Self {
Self {
catalog_pages: 100,
catalog_items: 2_048,
cursor_bytes: 64 * 1024,
schema_bytes: 64 * 1024,
description_bytes: 8 * 1024,
server_metadata_bytes: 32 * 1024,
message_bytes: 8 * 1024 * 1024,
output_text_bytes: 32 * 1024,
output_media_bytes: 5 * 1024 * 1024,
output_media_items: 8,
}
}
}
impl McpLimits {
pub(super) fn validate(&self) -> Result<(), BoxError> {
if [
self.catalog_pages,
self.catalog_items,
self.cursor_bytes,
self.schema_bytes,
self.description_bytes,
self.server_metadata_bytes,
self.message_bytes,
self.output_text_bytes,
self.output_media_bytes,
self.output_media_items,
]
.contains(&0)
|| self.output_text_bytes < 256
{
return Err(
"MCP limits must be positive and output_text_bytes must be at least 256".into(),
);
}
Ok(())
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(default)]
pub struct McpTimeouts {
pub setup_secs: u64,
pub list_secs: u64,
pub request_secs: u64,
pub call_secs: u64,
pub elicitation_secs: u64,
}
impl Default for McpTimeouts {
fn default() -> Self {
Self {
setup_secs: 90,
list_secs: 30,
request_secs: 180,
call_secs: 600,
elicitation_secs: 300,
}
}
}
impl McpTimeouts {
pub(super) fn validate(&self) -> Result<(), BoxError> {
if [
self.setup_secs,
self.list_secs,
self.request_secs,
self.call_secs,
self.elicitation_secs,
]
.iter()
.any(|n| !(1..=86_400).contains(n))
{
return Err("MCP timeouts must be between 1 and 86400 seconds".into());
}
Ok(())
}
pub(super) fn call(&self) -> Duration {
Duration::from_secs(self.call_secs)
}
}
#[derive(Debug, Clone, Copy, Default, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum McpConcurrency {
#[default]
Serial,
ReadOnlyParallel,
Parallel,
}
#[derive(Debug, Clone, Copy, Default, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum McpStartup {
#[default]
Eager,
Background,
}
#[derive(Debug, Clone, Copy, Default, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum McpServerStatus {
#[default]
Disconnected,
Connecting,
Connected,
Ready,
AuthorizationRequired,
Failed,
}