1use crate::error::Result;
4use async_trait::async_trait;
5use rmcp::model::Tool;
6use serde::{Deserialize, Serialize};
7use serde_json::Value;
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct ToolInfo {
12 pub name: String,
13 pub description: String,
14 pub input_schema: Value,
15}
16
17#[derive(Debug, Clone, Default)]
19pub struct StorageRequirements {
20 pub stable_memory: Option<u64>,
22 pub requires_persistence: bool,
24}
25
26#[async_trait]
28pub trait IcarusTool: Send + Sync {
29 fn info(&self) -> ToolInfo;
31
32 fn to_rmcp_tool(&self) -> Tool;
34
35 fn requires_stable_storage(&self) -> bool {
37 false
38 }
39
40 fn storage_requirements(&self) -> StorageRequirements {
42 StorageRequirements::default()
43 }
44
45 async fn execute(&self, args: Value) -> Result<Value>;
47}