Skip to main content

mcp_servers/coding/
tools_trait.rs

1use std::fmt::Debug;
2use std::future::Future;
3use std::path::PathBuf;
4
5use super::error::CodingError;
6use super::tools::ast_grep::{AstGrepInput, AstGrepOutput, perform_ast_grep};
7use super::tools::bash::{BackgroundProcessHandle, BashInput, BashResult, ReadBackgroundBashOutput};
8use super::tools::edit_file::{EditFileArgs, EditFileResponse};
9use super::tools::find::{FindInput, FindOutput, find_files_by_name};
10use super::tools::grep::{GrepInput, GrepOutput, perform_grep};
11use super::tools::list_files::{ListFilesArgs, ListFilesResult};
12use super::tools::read_file::{ReadFileArgs, ReadFileResult};
13use super::tools::write_file::{WriteFileArgs, WriteFileResponse};
14
15#[doc = include_str!("../docs/coding_tools.md")]
16pub trait CodingTools: Send + Sync + Debug {
17    /// Read a file's contents
18    fn read_file(&self, args: ReadFileArgs) -> impl Future<Output = Result<ReadFileResult, CodingError>> + Send;
19
20    /// Write content to a file
21    fn write_file(&self, args: WriteFileArgs) -> impl Future<Output = Result<WriteFileResponse, CodingError>> + Send;
22
23    /// Edit a file using string replacement
24    fn edit_file(&self, args: EditFileArgs) -> impl Future<Output = Result<EditFileResponse, CodingError>> + Send;
25
26    /// List files in a directory
27    fn list_files(&self, args: ListFilesArgs) -> impl Future<Output = Result<ListFilesResult, CodingError>> + Send;
28
29    /// Execute a bash command with an optional working directory
30    fn bash(
31        &self,
32        args: BashInput,
33        cwd: Option<PathBuf>,
34    ) -> impl Future<Output = Result<BashResult, CodingError>> + Send;
35
36    /// Read output from a background bash process
37    fn read_background_bash(
38        &self,
39        handle: BackgroundProcessHandle,
40        filter: Option<String>,
41    ) -> impl Future<Output = Result<(ReadBackgroundBashOutput, Option<BackgroundProcessHandle>), CodingError>> + Send;
42
43    /// Search file contents using regex patterns.
44    fn grep(&self, args: GrepInput) -> impl Future<Output = Result<GrepOutput, CodingError>> + Send {
45        async move { perform_grep(args).await.map_err(CodingError::from) }
46    }
47
48    fn ast_grep(&self, args: AstGrepInput) -> impl Future<Output = Result<AstGrepOutput, CodingError>> + Send {
49        async move { perform_ast_grep(args).await.map_err(CodingError::from) }
50    }
51
52    /// Find files by name using glob patterns.
53    fn find(&self, args: FindInput) -> impl Future<Output = Result<FindOutput, CodingError>> + Send {
54        async move { find_files_by_name(args).await.map_err(CodingError::from) }
55    }
56}