config_get.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package config
  2. import (
  3. "context"
  4. "encoding/json"
  5. "os"
  6. "path/filepath"
  7. "github.com/0xJacky/Nginx-UI/internal/config"
  8. "github.com/0xJacky/Nginx-UI/internal/helper"
  9. "github.com/0xJacky/Nginx-UI/internal/nginx"
  10. "github.com/0xJacky/Nginx-UI/query"
  11. "github.com/mark3labs/mcp-go/mcp"
  12. )
  13. const nginxConfigGetToolName = "nginx_config_get"
  14. var nginxConfigGetTool = mcp.NewTool(
  15. nginxConfigGetToolName,
  16. mcp.WithDescription("Get a specific Nginx configuration file"),
  17. mcp.WithString("relative_path", mcp.Description("The relative path to the configuration file")),
  18. )
  19. func handleNginxConfigGet(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  20. args := request.GetArguments()
  21. relativePath := args["relative_path"].(string)
  22. absPath := nginx.GetConfPath(relativePath)
  23. if !helper.IsUnderDirectory(absPath, nginx.GetConfPath()) {
  24. return nil, config.ErrPathIsNotUnderTheNginxConfDir
  25. }
  26. stat, err := os.Stat(absPath)
  27. if err != nil {
  28. return nil, err
  29. }
  30. content, err := os.ReadFile(absPath)
  31. if err != nil {
  32. return nil, err
  33. }
  34. q := query.Config
  35. cfg, err := q.Where(q.Filepath.Eq(absPath)).FirstOrInit()
  36. if err != nil {
  37. return nil, err
  38. }
  39. result := map[string]interface{}{
  40. "name": stat.Name(),
  41. "content": string(content),
  42. "file_path": absPath,
  43. "modified_at": stat.ModTime(),
  44. "dir": filepath.Dir(relativePath),
  45. "sync_node_ids": cfg.SyncNodeIds,
  46. "sync_overwrite": cfg.SyncOverwrite,
  47. }
  48. jsonResult, _ := json.Marshal(result)
  49. return mcp.NewToolResultText(string(jsonResult)), nil
  50. }