use turbomcp::__macro_support::turbomcp_core::handler::McpHandler;
use turbomcp::prelude::*;
use turbomcp_server::{VisibilityLayer, VisibilitySessionGuard};
use turbomcp_types::component::ComponentFilter;
#[derive(Clone)]
struct FeatureServer;
#[turbomcp::server(name = "feature-server", version = "1.0.0")]
impl FeatureServer {
#[tool(description = "Get current time", tags = ["public", "readonly"])]
async fn get_time(&self) -> McpResult<String> {
Ok(chrono::Utc::now().to_rfc3339())
}
#[tool(description = "Say hello", tags = ["public"])]
async fn greet(&self, name: String) -> McpResult<String> {
Ok(format!("Hello, {}!", name))
}
#[tool(description = "Premium feature", tags = ["premium"])]
async fn premium_feature(&self) -> McpResult<String> {
Ok("Welcome to premium! You have access to advanced features.".into())
}
#[tool(description = "Admin dashboard", tags = ["admin"])]
async fn admin_dashboard(&self) -> McpResult<String> {
Ok("Admin Dashboard: 42 users, 100 requests/min".into())
}
#[tool(description = "Delete all data", tags = ["admin", "dangerous"])]
async fn delete_all(&self) -> McpResult<String> {
Ok("All data deleted (simulated)".into())
}
#[resource("config://settings", tags = ["premium", "config"])]
async fn get_settings(&self, _uri: String, _ctx: &RequestContext) -> McpResult<String> {
Ok(r#"{"theme": "dark", "notifications": true}"#.into())
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Progressive Disclosure Demo ===\n");
let server = FeatureServer;
println!("All tools (no filtering):");
println!("-------------------------");
for tool in server.list_tools() {
print_tool(&tool);
}
println!();
let visibility = VisibilityLayer::new(server.clone())
.with_disabled(ComponentFilter::with_tags(["admin", "dangerous"]));
println!("Tools visible to regular users (admin/dangerous hidden):");
println!("--------------------------------------------------------");
for tool in visibility.list_tools() {
print_tool(&tool);
}
println!();
println!("Resources visible to regular users:");
println!("-----------------------------------");
for resource in visibility.list_resources() {
println!(" {} ({})", resource.name, resource.uri);
}
println!();
println!("=== Session-Specific Access ===\n");
let session_id = "user-123";
let premium_tags = vec!["premium".to_string()];
visibility.enable_for_session(session_id, &premium_tags);
println!("After enabling 'premium' tag for session '{}':", session_id);
println!(" Premium features would now be visible for this session");
println!(" Other sessions still don't see premium tools");
println!();
visibility.clear_session(session_id);
println!("Session state cleared for '{}'", session_id);
println!();
println!(
"Active sessions tracking: {}",
visibility.active_sessions_count()
);
println!();
println!("=== Best Practice: Session Guard (RAII) ===\n");
{
let _guard: VisibilitySessionGuard = visibility.session_guard("user-456");
let admin_tags = vec!["admin".to_string()];
visibility.enable_for_session("user-456", &admin_tags);
println!(" Session 'user-456' has admin access within this scope");
println!(" Active sessions: {}", visibility.active_sessions_count());
}
println!(" After scope ends, session is automatically cleaned up");
println!(" Active sessions: {}", visibility.active_sessions_count());
Ok(())
}
fn print_tool(tool: &Tool) {
print!(" {} ", tool.name);
if let Some(meta) = &tool.meta
&& let Some(tags) = meta.get("tags")
{
print!("{}", tags);
}
println!();
}