use rmcp::schemars;
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, schemars::JsonSchema)]
pub struct ProposeInput {
pub thought_process: String,
pub content: String,
}
#[derive(Debug, Deserialize, schemars::JsonSchema)]
pub struct EvaluateInput {
pub evaluations: Vec<EvaluationItem>,
}
#[derive(Debug, Default, Deserialize, schemars::JsonSchema)]
pub struct EvaluationItem {
pub target_id: String,
pub score: f32,
pub justification: String,
#[serde(default)]
pub stance: Option<String>,
#[serde(default)]
pub is_final_solution: bool,
#[serde(default)]
pub claim_assessments: Vec<McpClaimAssessment>,
#[serde(default)]
pub disagreements: Vec<McpDisagreementPoint>,
#[serde(default)]
pub category_scores: Option<McpCategoryScores>,
}
#[derive(Debug, Clone, Deserialize, schemars::JsonSchema)]
pub struct McpClaimAssessment {
#[serde(default)]
pub claim_id: Option<String>,
#[serde(default, alias = "content", alias = "text", alias = "claim_text")]
pub claim: String,
pub verdict: String,
#[serde(default, alias = "explanation", alias = "reasoning")]
pub reason: Option<String>,
}
#[derive(Debug, Clone, Deserialize, schemars::JsonSchema)]
pub struct McpDisagreementPoint {
#[serde(default)]
pub claim_id: Option<String>,
#[serde(default, alias = "claim", alias = "what_they_claimed")]
pub proposal_claims: String,
#[serde(default, alias = "counter_position", alias = "position")]
pub evaluator_position: String,
#[serde(default = "default_confidence")]
pub confidence: String,
}
fn default_confidence() -> String {
"medium".to_string()
}
#[derive(Debug, Clone, Deserialize, schemars::JsonSchema)]
pub struct McpCategoryScores {
#[serde(default)]
pub correctness: f32,
#[serde(default)]
pub completeness: f32,
#[serde(default)]
pub novelty: f32,
#[serde(default)]
pub feasibility: f32,
#[serde(default)]
pub evidence_quality: f32,
}
#[derive(Debug, Deserialize, schemars::JsonSchema)]
pub struct ReadProposalInput {
pub round: Option<u32>,
pub agent_id: String,
pub offset: Option<usize>,
pub limit: Option<usize>,
}
#[derive(Debug, Deserialize, schemars::JsonSchema)]
pub struct ReadCritiquesInput {
pub round: Option<u32>,
pub agent_id: Option<String>,
}
#[derive(Debug, Deserialize, schemars::JsonSchema)]
pub struct SearchInput {
pub query: String,
pub round: Option<u32>,
pub agent_id: Option<String>,
}
#[derive(Debug, Deserialize, schemars::JsonSchema)]
pub struct UpdateScratchpadInput {
pub content: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum McpResult {
Proposal {
thought_process: String,
content: String,
},
Evaluations(Vec<McpEvaluationResult>),
}
#[derive(Debug, Serialize, Deserialize)]
pub struct McpEvaluationResult {
pub target_id: String,
pub score: f32,
pub justification: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub stance: Option<String>,
#[serde(default)]
pub is_final_solution: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub claim_assessments: Vec<McpClaimAssessmentResult>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub disagreements: Vec<McpDisagreementResult>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub category_scores: Option<McpCategoryScores>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpClaimAssessmentResult {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub claim_id: Option<String>,
pub claim: String,
pub verdict: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpDisagreementResult {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub claim_id: Option<String>,
pub proposal_claims: String,
pub evaluator_position: String,
pub confidence: String,
}
impl Serialize for McpCategoryScores {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
use serde::ser::SerializeStruct;
let mut s = serializer.serialize_struct("McpCategoryScores", 5)?;
s.serialize_field("correctness", &self.correctness)?;
s.serialize_field("completeness", &self.completeness)?;
s.serialize_field("novelty", &self.novelty)?;
s.serialize_field("feasibility", &self.feasibility)?;
s.serialize_field("evidence_quality", &self.evidence_quality)?;
s.end()
}
}