use descry_tool_core::{
adapters::{AnthropicAdapter, McpAdapter, OpenAiAdapter, ToolAdapter},
tool_names, ToolContext, ToolError,
};
use descry_tool_macros::tool;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Deserialize, JsonSchema)]
struct GreetParams {
name: String,
#[serde(default)]
formal: bool,
}
#[derive(Serialize, JsonSchema)]
struct GreetOutput {
greeting: String,
}
#[tool(
name = "greet",
description = "Generate a greeting message"
)]
async fn greet(_ctx: Arc<ToolContext>, params: GreetParams) -> Result<GreetOutput, ToolError> {
let greeting = if params.formal {
format!("Good day, {}!", params.name)
} else {
format!("Hi, {}!", params.name)
};
Ok(GreetOutput { greeting })
}
#[tokio::main]
async fn main() {
println!("=== Multi-Protocol Adapter Example ===\n");
let names = tool_names();
println!("Registered tools: {:?}\n", names);
let meta = descry_tool_core::find_tool("greet").unwrap();
println!("1. MCP (Model Context Protocol) Format:");
let mcp_spec = McpAdapter::to_spec(meta);
println!("{}\n", serde_json::to_string_pretty(&mcp_spec).unwrap());
println!("2. OpenAI Function Calling Format:");
let openai_spec = OpenAiAdapter::to_spec(meta);
println!("{}\n", serde_json::to_string_pretty(&openai_spec).unwrap());
println!("3. Anthropic (Claude) Format:");
let anthropic_spec = AnthropicAdapter::to_spec(meta);
println!("{}\n", serde_json::to_string_pretty(&anthropic_spec).unwrap());
println!("=== Response Conversion ===\n");
let output = serde_json::json!({"greeting": "Hi, Dave!"});
println!("MCP Response:");
let mcp_resp = McpAdapter::to_response(output.clone());
println!("{}\n", serde_json::to_string_pretty(&mcp_resp).unwrap());
println!("OpenAI Response:");
let openai_resp = OpenAiAdapter::to_response_with_id(output.clone(), "call_789".to_string());
println!("{}\n", serde_json::to_string_pretty(&openai_resp).unwrap());
println!("Anthropic Response:");
let anthropic_resp = AnthropicAdapter::to_response_with_id(output.clone(), "toolu_012".to_string());
println!("{}\n", serde_json::to_string_pretty(&anthropic_resp).unwrap());
println!("=== Generate Tool Lists for Different Protocols ===\n");
let mcp_tools: Vec<_> = descry_tool_core::all_tools()
.map(|meta| McpAdapter::to_spec(meta))
.collect();
println!("MCP Tools: {} tools available", mcp_tools.len());
for tool in &mcp_tools {
println!(" - {}", tool.name);
}
println!();
let openai_tools: Vec<_> = descry_tool_core::all_tools()
.map(|meta| OpenAiAdapter::to_spec(meta))
.collect();
println!("OpenAI Tools: {} tools available", openai_tools.len());
for tool in &openai_tools {
println!(" - {}", tool.function.name);
}
println!();
let anthropic_tools: Vec<_> = descry_tool_core::all_tools()
.map(|meta| AnthropicAdapter::to_spec(meta))
.collect();
println!("Anthropic Tools: {} tools available", anthropic_tools.len());
for tool in &anthropic_tools {
println!(" - {}", tool.name);
}
}