Skip to main content
Glama

Rust MCP Filesystem

test_tools.rs5.27 kB
#[path = "common/common.rs"] pub mod common; use common::setup_service; use rust_mcp_filesystem::tools::*; use rust_mcp_sdk::schema::{ContentBlock, schema_utils::CallToolError}; use std::{collections::HashSet, fs}; #[tokio::test] async fn test_create_directory_new_directory() { let (temp_dir, service, _allowed_dirs) = setup_service(vec!["dir1".to_string()]); let new_dir = temp_dir.join("dir1").join("new_dir"); let params = CreateDirectory { path: new_dir.to_str().unwrap().to_string(), }; let result = CreateDirectory::run_tool(params, &service).await; assert!(result.is_ok()); let call_result = result.unwrap(); assert_eq!(call_result.content.len(), 1); let content = call_result.content.first().unwrap(); match content { ContentBlock::TextContent(text_content) => { assert_eq!( text_content.text, format!( "Successfully created directory {}", new_dir.to_str().unwrap() ) ); } _ => panic!("Expected TextContent result"), } assert!(new_dir.is_dir()); } #[tokio::test] async fn test_create_directory_existing_directory() { let (temp_dir, service, _allowed_dirs) = setup_service(vec!["dir1".to_string()]); let existing_dir = temp_dir.join("dir1").join("existing_dir"); fs::create_dir_all(&existing_dir).unwrap(); let params = CreateDirectory { path: existing_dir.to_str().unwrap().to_string(), }; let result = CreateDirectory::run_tool(params, &service).await; assert!(result.is_ok()); let call_result = result.unwrap(); assert_eq!(call_result.content.len(), 1); let content = call_result.content.first().unwrap(); match content { ContentBlock::TextContent(text_content) => { assert_eq!( text_content.text, format!( "Successfully created directory {}", existing_dir.to_str().unwrap() ) ); } _ => panic!("Expected TextContent result"), } assert!(existing_dir.is_dir()); } #[tokio::test] async fn test_create_directory_nested() { let (temp_dir, service, _allowed_dirs) = setup_service(vec!["dir1".to_string()]); let nested_dir = temp_dir.join("dir1").join("nested/subdir"); let params = CreateDirectory { path: nested_dir.to_str().unwrap().to_string(), }; let result = CreateDirectory::run_tool(params, &service).await; assert!(result.is_ok()); let call_result = result.unwrap(); assert_eq!(call_result.content.len(), 1); let content = call_result.content.first().unwrap(); match content { ContentBlock::TextContent(text_content) => { assert_eq!( text_content.text, format!( "Successfully created directory {}", nested_dir.to_str().unwrap() ) ); } _ => panic!("Expected TextContent result"), } } #[tokio::test] async fn test_create_directory_outside_allowed() { let (temp_dir, service, _allowed_dirs) = setup_service(vec!["dir1".to_string()]); let outside_dir = temp_dir.join("dir2").join("forbidden"); let params = CreateDirectory { path: outside_dir.to_str().unwrap().to_string(), }; let result = CreateDirectory::run_tool(params, &service).await; assert!(result.is_err()); let err = result.unwrap_err(); assert!(matches!(err, CallToolError { .. })); assert!(!outside_dir.exists()); } #[tokio::test] async fn test_create_directory_invalid_path() { let (temp_dir, service, _allowed_dirs) = setup_service(vec!["dir1".to_string()]); let invalid_path = temp_dir.join("dir1").join("invalid\0dir"); let params = CreateDirectory { path: invalid_path .to_str() .map_or("invalid\0dir".to_string(), |s| s.to_string()), }; let result = CreateDirectory::run_tool(params, &service).await; assert!(result.is_err()); let err = result.unwrap_err(); assert!(matches!(err, CallToolError { .. })); } // Github Issue #54 // https://github.com/rust-mcp-stack/rust-mcp-filesystem/issues/54 #[tokio::test] async fn ensure_tools_duplication() { let mut names = HashSet::new(); let mut duplicate_names = vec![]; let mut titles = HashSet::new(); let mut duplicate_titles = vec![]; let mut descriptions = HashSet::new(); let mut duplicate_descriptions = vec![]; for t in FileSystemTools::tools() { if !names.insert(t.name.to_string()) { duplicate_names.push(t.name.to_string()); } if let Some(title) = t.title && !titles.insert(title.to_string()) { duplicate_titles.push(title.to_string()); } if let Some(description) = t.description && !descriptions.insert(description.to_string()) { duplicate_descriptions.push(description.to_string()); } } assert_eq!(duplicate_names.join(","), ""); assert_eq!(duplicate_titles.join(","), ""); assert_eq!(duplicate_descriptions.join(","), ""); } #[tokio::test] async fn adhoc() {}

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rust-mcp-stack/rust-mcp-filesystem'

If you have feedback or need assistance with the MCP directory API, please join our Discord server