Files
filepuff-mcp/cmd/mcp-filepuff/main.go
T
2026-01-18 18:40:26 +00:00

85 lines
1.9 KiB
Go

// Package main is the entry point for the MCP file operations server.
package main
import (
"context"
"flag"
"log/slog"
"os"
"github.com/lukaszraczylo/mcp-filepuff/internal/config"
"github.com/lukaszraczylo/mcp-filepuff/internal/server"
)
func main() {
// Parse command line flags
var (
workspaceRoot = flag.String("workspace", "", "Workspace root directory (default: current directory)")
logLevel = flag.String("log-level", "info", "Log level (debug, info, warn, error)")
logFile = flag.String("log-file", "", "Log file path (default: stderr)")
)
flag.Parse()
// Set up logging
logger := setupLogger(*logLevel, *logFile)
// Load configuration
cfg, err := config.Load(*workspaceRoot)
if err != nil {
logger.Error("failed to load configuration", "error", err)
os.Exit(1)
}
logger.Info("configuration loaded",
"workspace_root", cfg.WorkspaceRoot,
"lsp_enabled", cfg.EnableLSP,
)
// Create and run server
srv, err := server.New(cfg, logger)
if err != nil {
logger.Error("failed to create server", "error", err)
os.Exit(1)
}
ctx := context.Background()
if err := srv.Run(ctx); err != nil {
logger.Error("server error", "error", err)
os.Exit(1)
}
}
func setupLogger(level string, logFile string) *slog.Logger {
var logLevel slog.Level
switch level {
case "debug":
logLevel = slog.LevelDebug
case "warn":
logLevel = slog.LevelWarn
case "error":
logLevel = slog.LevelError
default:
logLevel = slog.LevelInfo
}
opts := &slog.HandlerOptions{
Level: logLevel,
}
var handler slog.Handler
if logFile != "" {
f, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
if err != nil {
// Fallback to stderr
handler = slog.NewJSONHandler(os.Stderr, opts)
} else {
handler = slog.NewJSONHandler(f, opts)
}
} else {
// Use stderr for MCP servers (stdout is for protocol messages)
handler = slog.NewJSONHandler(os.Stderr, opts)
}
return slog.New(handler)
}