mirror of
				https://gitea.com/gitea/gitea-mcp.git
				synced 2025-10-30 01:41:50 +00:00 
			
		
		
		
	feat: add GetDirContent tool for retrieving directory entries (#53)
### 🚀 What's Changed This PR introduces a new MCP tool `get_dir_content` that allows users to retrieve a list of entries (files and subdirectories) from a specified directory in a Gitea repository. ### ✨ Features Added - **New Tool**: `GetDirContent` tool for directory listing functionality - **Tool Registration**: Properly registered as a read operation in the MCP server - **Parameter Validation**: Comprehensive input validation for required parameters - **Error Handling**: Robust error handling with descriptive error messages ### 🔧 Technical Details - **Tool Name**: `get_dir_content` - **Required Parameters**: - `owner`: Repository owner - `repo`: Repository name - `ref`: Branch, tag, or commit reference - `filePath`: Directory path to list ### 📁 Files Modified - file.go: Added tool definition, registration, and handler function ### 🎯 Use Cases This tool enables users to: - Browse repository directory structures - List files and folders in specific directories - Navigate repository contents programmatically - Support file management workflows in MCP clients Reviewed-on: https://gitea.com/gitea/gitea-mcp/pulls/53 Reviewed-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: ZRE <chy853@gmail.com> Co-committed-by: ZRE <chy853@gmail.com>
This commit is contained in:
		| @@ -194,6 +194,7 @@ The Gitea MCP Server supports the following tools: | |||||||
| |          list_tags           |     Tag      |              List all tags in a repository               | | |          list_tags           |     Tag      |              List all tags in a repository               | | ||||||
| |      list_repo_commits       |    Commit    |             List all commits in a repository             | | |      list_repo_commits       |    Commit    |             List all commits in a repository             | | ||||||
| |       get_file_content       |     File     |          Get the content and metadata of a file          | | |       get_file_content       |     File     |          Get the content and metadata of a file          | | ||||||
|  | |        get_dir_content       |     File     |           Get a list of entries in a directory           | | ||||||
| |         create_file          |     File     |                    Create a new file                     | | |         create_file          |     File     |                    Create a new file                     | | ||||||
| |         update_file          |     File     |                 Update an existing file                  | | |         update_file          |     File     |                 Update an existing file                  | | ||||||
| |         delete_file          |     File     |                      Delete a file                       | | |         delete_file          |     File     |                      Delete a file                       | | ||||||
|   | |||||||
| @@ -194,6 +194,7 @@ Gitea MCP 服务器支持以下工具: | |||||||
| |          list_tags           |   标签   |         列出所有标签         | | |          list_tags           |   标签   |         列出所有标签         | | ||||||
| |      list_repo_commits       |   提交   |     列出仓库中的所有提交     | | |      list_repo_commits       |   提交   |     列出仓库中的所有提交     | | ||||||
| |       get_file_content       |   文件   |    获取文件的内容和元数据    | | |       get_file_content       |   文件   |    获取文件的内容和元数据    | | ||||||
|  | |        get_dir_content       |   文件   |      获取目录的内容列表      | | ||||||
| |         create_file          |   文件   |        创建一个新文件        | | |         create_file          |   文件   |        创建一个新文件        | | ||||||
| |         update_file          |   文件   |         更新现有文件         | | |         update_file          |   文件   |         更新现有文件         | | ||||||
| |         delete_file          |   文件   |         删除一个文件         | | |         delete_file          |   文件   |         删除一个文件         | | ||||||
|   | |||||||
| @@ -194,6 +194,7 @@ Gitea MCP 伺服器支持以下工具: | |||||||
| |          list_tags           |   標籤   |         列出所有標籤         | | |          list_tags           |   標籤   |         列出所有標籤         | | ||||||
| |      list_repo_commits       |   提交   |     列出倉庫中的所有提交     | | |      list_repo_commits       |   提交   |     列出倉庫中的所有提交     | | ||||||
| |       get_file_content       |   文件   |    獲取文件的內容和元數據    | | |       get_file_content       |   文件   |    獲取文件的內容和元數據    | | ||||||
|  | |        get_dir_content       |   文件   |      獲取目錄的內容列表      | | ||||||
| |         create_file          |   文件   |        創建一個新文件        | | |         create_file          |   文件   |        創建一個新文件        | | ||||||
| |         update_file          |   文件   |         更新現有文件         | | |         update_file          |   文件   |         更新現有文件         | | ||||||
| |         delete_file          |   文件   |         刪除一個文件         | | |         delete_file          |   文件   |         刪除一個文件         | | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ import ( | |||||||
|  |  | ||||||
| const ( | const ( | ||||||
| 	GetFileToolName    = "get_file_content" | 	GetFileToolName    = "get_file_content" | ||||||
|  | 	GetDirToolName     = "get_dir_content" | ||||||
| 	CreateFileToolName = "create_file" | 	CreateFileToolName = "create_file" | ||||||
| 	UpdateFileToolName = "update_file" | 	UpdateFileToolName = "update_file" | ||||||
| 	DeleteFileToolName = "delete_file" | 	DeleteFileToolName = "delete_file" | ||||||
| @@ -31,6 +32,15 @@ var ( | |||||||
| 		mcp.WithString("filePath", mcp.Required(), mcp.Description("file path")), | 		mcp.WithString("filePath", mcp.Required(), mcp.Description("file path")), | ||||||
| 	) | 	) | ||||||
|  |  | ||||||
|  | 	GetDirContentTool = mcp.NewTool( | ||||||
|  | 		GetDirToolName, | ||||||
|  | 		mcp.WithDescription("Get a list of entries in a directory"), | ||||||
|  | 		mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner")), | ||||||
|  | 		mcp.WithString("repo", mcp.Required(), mcp.Description("repository name")), | ||||||
|  | 		mcp.WithString("ref", mcp.Required(), mcp.Description("ref can be branch/tag/commit")), | ||||||
|  | 		mcp.WithString("filePath", mcp.Required(), mcp.Description("directory path")), | ||||||
|  | 	) | ||||||
|  |  | ||||||
| 	CreateFileTool = mcp.NewTool( | 	CreateFileTool = mcp.NewTool( | ||||||
| 		CreateFileToolName, | 		CreateFileToolName, | ||||||
| 		mcp.WithDescription("Create file"), | 		mcp.WithDescription("Create file"), | ||||||
| @@ -72,6 +82,10 @@ func init() { | |||||||
| 		Tool:    GetFileContentTool, | 		Tool:    GetFileContentTool, | ||||||
| 		Handler: GetFileContentFn, | 		Handler: GetFileContentFn, | ||||||
| 	}) | 	}) | ||||||
|  | 	Tool.RegisterRead(server.ServerTool{ | ||||||
|  | 		Tool:    GetDirContentTool, | ||||||
|  | 		Handler: GetDirContentFn, | ||||||
|  | 	}) | ||||||
| 	Tool.RegisterWrite(server.ServerTool{ | 	Tool.RegisterWrite(server.ServerTool{ | ||||||
| 		Tool:    CreateFileTool, | 		Tool:    CreateFileTool, | ||||||
| 		Handler: CreateFileFn, | 		Handler: CreateFileFn, | ||||||
| @@ -108,6 +122,28 @@ func GetFileContentFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallTo | |||||||
| 	return to.TextResult(content) | 	return to.TextResult(content) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func GetDirContentFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { | ||||||
|  | 	log.Debugf("Called GetDirContentFn") | ||||||
|  | 	owner, ok := req.GetArguments()["owner"].(string) | ||||||
|  | 	if !ok { | ||||||
|  | 		return to.ErrorResult(fmt.Errorf("owner is required")) | ||||||
|  | 	} | ||||||
|  | 	repo, ok := req.GetArguments()["repo"].(string) | ||||||
|  | 	if !ok { | ||||||
|  | 		return to.ErrorResult(fmt.Errorf("repo is required")) | ||||||
|  | 	} | ||||||
|  | 	ref, _ := req.GetArguments()["ref"].(string) | ||||||
|  | 	filePath, ok := req.GetArguments()["filePath"].(string) | ||||||
|  | 	if !ok { | ||||||
|  | 		return to.ErrorResult(fmt.Errorf("filePath is required")) | ||||||
|  | 	} | ||||||
|  | 	content, _, err := gitea.Client().ListContents(owner, repo, ref, filePath) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return to.ErrorResult(fmt.Errorf("get dir content err: %v", err)) | ||||||
|  | 	} | ||||||
|  | 	return to.TextResult(content) | ||||||
|  | } | ||||||
|  |  | ||||||
| func CreateFileFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { | func CreateFileFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { | ||||||
| 	log.Debugf("Called CreateFileFn") | 	log.Debugf("Called CreateFileFn") | ||||||
| 	owner, ok := req.GetArguments()["owner"].(string) | 	owner, ok := req.GetArguments()["owner"].(string) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user