use composio_sdk::ComposioClient;
use std::error::Error;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let api_key = std::env::var("COMPOSIO_API_KEY")
.expect("COMPOSIO_API_KEY environment variable not set");
let client = ComposioClient::builder()
.api_key(&api_key)
.build()?;
println!("=== Tool Router Experimental Features Demo ===\n");
println!("1. Creating session with timezone-aware assistive prompt...");
let session = client
.create_session("user_experimental_demo")
.toolkits(vec!["github", "gmail"])
.experimental(Some("America/New_York".to_string()))
.send()
.await?;
println!(" ✓ Session created: {}", session.session_id());
println!(" ✓ MCP URL: {}", session.mcp_url());
println!();
println!("2. Fetching meta tools...");
let meta_tools = session.get_meta_tools().await?;
println!(" ✓ Found {} meta tools:", meta_tools.len());
for tool in &meta_tools {
println!(" - {} ({})", tool.name, tool.slug);
}
println!();
println!("3. Listing toolkits with connection status...");
let toolkits = session.list_toolkits().send().await?;
println!(" ✓ Found {} toolkits:", toolkits.items.len());
for toolkit in toolkits.items.iter().take(5) {
let status = if toolkit.is_no_auth {
"No auth required".to_string()
} else if let Some(ref conn) = toolkit.connection {
if conn.is_active {
"Connected".to_string()
} else {
"Not connected".to_string()
}
} else {
"Not connected".to_string()
};
println!(" - {} ({}): {}", toolkit.name, toolkit.slug, status);
}
println!();
println!("4. Creating authentication link for GitHub...");
match session.create_auth_link("github", None).await {
Ok(link) => {
println!(" ✓ Auth link created:");
println!(" - Link token: {}", link.link_token);
println!(" - Redirect URL: {}", link.redirect_url);
if let Some(account_id) = link.connected_account_id {
println!(" - Connected account: {}", account_id);
}
}
Err(e) => {
println!(" ⚠ Could not create auth link: {}", e);
println!(" (This is expected if already connected)");
}
}
println!();
println!("5. Creating session with workbench configuration...");
let workbench_session = client
.create_session("user_workbench_demo")
.toolkits(vec!["github"])
.workbench(Some(true), Some(1000))
.send()
.await?;
println!(" ✓ Workbench session created: {}", workbench_session.session_id());
println!();
println!("6. Creating session with tag-based tool filtering...");
use composio_sdk::models::enums::TagType;
let filtered_session = client
.create_session("user_filtered_demo")
.toolkits(vec!["github"])
.tags(
Some(vec![TagType::ReadOnlyHint]), Some(vec![TagType::DestructiveHint]) )
.send()
.await?;
println!(" ✓ Filtered session created: {}", filtered_session.session_id());
println!(" ✓ Only read-only, non-destructive tools available");
println!();
println!("=== Demo Complete ===");
println!("\nKey Features Demonstrated:");
println!(" • Experimental assistive prompts with timezone");
println!(" • Toolkit connection status checking");
println!(" • Authentication link generation");
println!(" • Workbench configuration");
println!(" • Tag-based tool filtering");
Ok(())
}