mirror of
https://gitea.com/gitea/gitea-mcp.git
synced 2025-08-23 14:23:05 +00:00
Add withLines option to get_file_content (#76)
Reviewed-on: https://gitea.com/gitea/gitea-mcp/pulls/76 Reviewed-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: yp05327 <576951401@qq.com> Co-committed-by: yp05327 <576951401@qq.com>
This commit is contained in:
@@ -1,8 +1,11 @@
|
|||||||
package repo
|
package repo
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"gitea.com/gitea/gitea-mcp/pkg/gitea"
|
"gitea.com/gitea/gitea-mcp/pkg/gitea"
|
||||||
@@ -30,6 +33,7 @@ var (
|
|||||||
mcp.WithString("repo", mcp.Required(), mcp.Description("repository name")),
|
mcp.WithString("repo", mcp.Required(), mcp.Description("repository name")),
|
||||||
mcp.WithString("ref", mcp.Required(), mcp.Description("ref can be branch/tag/commit")),
|
mcp.WithString("ref", mcp.Required(), mcp.Description("ref can be branch/tag/commit")),
|
||||||
mcp.WithString("filePath", mcp.Required(), mcp.Description("file path")),
|
mcp.WithString("filePath", mcp.Required(), mcp.Description("file path")),
|
||||||
|
mcp.WithBoolean("withLines", mcp.Description("whether to return file content with lines")),
|
||||||
)
|
)
|
||||||
|
|
||||||
GetDirContentTool = mcp.NewTool(
|
GetDirContentTool = mcp.NewTool(
|
||||||
@@ -100,6 +104,11 @@ func init() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ContentLine struct {
|
||||||
|
LineNumber int `json:"line"`
|
||||||
|
Content string `json:"content"`
|
||||||
|
}
|
||||||
|
|
||||||
func GetFileContentFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
func GetFileContentFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||||||
log.Debugf("Called GetFileFn")
|
log.Debugf("Called GetFileFn")
|
||||||
owner, ok := req.GetArguments()["owner"].(string)
|
owner, ok := req.GetArguments()["owner"].(string)
|
||||||
@@ -119,6 +128,34 @@ func GetFileContentFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallTo
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return to.ErrorResult(fmt.Errorf("get file err: %v", err))
|
return to.ErrorResult(fmt.Errorf("get file err: %v", err))
|
||||||
}
|
}
|
||||||
|
withLines, _ := req.GetArguments()["withLines"].(bool)
|
||||||
|
if withLines {
|
||||||
|
rawContent, err := base64.StdEncoding.DecodeString(*content.Content)
|
||||||
|
if err != nil {
|
||||||
|
return to.ErrorResult(fmt.Errorf("decode base64 content err: %v", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
contentLines := make([]ContentLine, 0)
|
||||||
|
line := 0
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(bytes.NewReader(rawContent))
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
line++
|
||||||
|
|
||||||
|
contentLines = append(contentLines, ContentLine{
|
||||||
|
LineNumber: line,
|
||||||
|
Content: scanner.Text(),
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
contentBytes, err := json.MarshalIndent(contentLines, "", " ")
|
||||||
|
if err != nil {
|
||||||
|
return to.ErrorResult(fmt.Errorf("marshal content lines err: %v", err))
|
||||||
|
}
|
||||||
|
contentStr := string(contentBytes)
|
||||||
|
content.Content = &contentStr
|
||||||
|
}
|
||||||
return to.TextResult(content)
|
return to.TextResult(content)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user