1use async_trait::async_trait;
8use serde_json::{json, Value};
9
10use crate::protocol::CallToolResult;
11use crate::tool::{Context, Tool};
12
13pub struct ListModels;
14
15#[async_trait]
16impl Tool for ListModels {
17 fn name(&self) -> &'static str {
18 "list-models"
19 }
20 fn description(&self) -> &'static str {
21 "List every cast model registered via `#[derive(Model)]`. Returns table name and Rust struct path."
22 }
23
24 async fn call(&self, _ctx: &Context, _args: Value) -> CallToolResult {
25 let models = cast_core::registered_models();
28 let payload: Vec<Value> = models
29 .iter()
30 .map(|m| {
31 json!({
32 "class": m.class,
33 "table": m.table,
34 })
35 })
36 .collect();
37 CallToolResult::json(&json!({
38 "count": payload.len(),
39 "models": payload,
40 }))
41 }
42}