main
1# Go MCP Servers Makefile
2.PHONY: all build test clean install uninstall fmt vet lint e2e help
3
4# Variables
5GOCMD = go
6GOBUILD = $(GOCMD) build
7GOTEST = $(GOCMD) test
8GOFMT = $(GOCMD) fmt
9GOVET = $(GOCMD) vet
10BINDIR = bin
11INSTALLDIR = /usr/local/bin
12
13# Server binaries
14SERVERS = git filesystem fetch memory sequential-thinking time maildir signal gitlab imap bash speech
15BINARIES = $(addprefix $(BINDIR)/mcp-,$(SERVERS))
16
17# Build flags
18LDFLAGS = -ldflags="-s -w"
19BUILD_FLAGS = $(LDFLAGS) -trimpath
20
21all: build ## Build all servers
22
23build: $(BINARIES) ## Build all MCP servers
24
25$(BINDIR)/mcp-%: cmd/%/main.go
26 @mkdir -p $(BINDIR)
27 @if [ "$*" = "signal" ]; then \
28 CGO_ENABLED=1 $(GOBUILD) $(BUILD_FLAGS) -o $@ ./cmd/$*; \
29 else \
30 $(GOBUILD) $(BUILD_FLAGS) -o $@ ./cmd/$*; \
31 fi
32
33test: ## Run all tests
34 $(GOTEST) -v ./...
35
36test-smoke: clean build
37 @echo "Running smoke tests for all MCP servers..."
38 @for server in $(SERVERS); do \
39 echo "Testing mcp-$$server..."; \
40 echo '{"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {}}' | ./bin/mcp-$$server . | jq '.'; \
41 echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}' | ./bin/mcp-$$server . | jq '.'; \
42 echo '{"jsonrpc": "2.0", "id": 1, "method": "resources/list", "params": {}}' | ./bin/mcp-$$server . | jq '.'; \
43 echo '{"jsonrpc": "2.0", "id": 1, "method": "prompts/list", "params": {}}' | ./bin/mcp-$$server . | jq '.'; \
44 echo '{"jsonrpc": "2.0", "id": 1, "method": "roots/list", "params": {}}' | ./bin/mcp-$$server . | jq '.'; \
45 done
46
47test-coverage: ## Run tests with coverage
48 $(GOTEST) -cover ./...
49
50e2e: clean build ## Run end-to-end integration tests
51 @echo "Running e2e integration tests..."
52 cd test/integration && $(GOTEST) -v -timeout=30s ./...
53
54clean: ## Clean build artifacts
55 rm -rf $(BINDIR)
56
57install: build ## Install binaries to system (requires sudo)
58 @echo "Installing MCP servers to $(INSTALLDIR)..."
59 @for binary in $(BINARIES); do \
60 echo "Installing $$binary to $(INSTALLDIR)"; \
61 install -m 755 $$binary $(INSTALLDIR)/; \
62 done
63 @echo "Installation complete!"
64
65uninstall: ## Remove installed binaries
66 @echo "Removing MCP servers from $(INSTALLDIR)..."
67 @for server in $(SERVERS); do \
68 rm -f $(INSTALLDIR)/mcp-$$server; \
69 done
70 @echo "Uninstall complete!"
71
72fmt: ## Format Go source code
73 $(GOFMT) ./...
74
75vet: ## Run go vet
76 $(GOVET) ./...
77
78lint: fmt vet ## Run formatting and vetting
79
80dev-setup: ## Set up development environment
81 @echo "Setting up development environment..."
82 @go mod download
83 @go mod tidy
84 @echo "Development environment ready!"
85
86release: clean test build ## Build release version
87 @echo "Building release binaries..."
88 @for server in $(SERVERS); do \
89 echo "Building mcp-$$server..."; \
90 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) $(BUILD_FLAGS) -o $(BINDIR)/linux-amd64/mcp-$$server ./cmd/$$server; \
91 CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 $(GOBUILD) $(BUILD_FLAGS) -o $(BINDIR)/darwin-amd64/mcp-$$server ./cmd/$$server; \
92 CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 $(GOBUILD) $(BUILD_FLAGS) -o $(BINDIR)/darwin-arm64/mcp-$$server ./cmd/$$server; \
93 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 $(GOBUILD) $(BUILD_FLAGS) -o $(BINDIR)/windows-amd64/mcp-$$server.exe ./cmd/$$server; \
94 done
95 @echo "Release build complete!"
96
97benchmark: ## Run benchmarks
98 $(GOTEST) -bench=. -benchmem ./...
99
100deps: ## Download dependencies
101 $(GOCMD) mod download
102 $(GOCMD) mod tidy
103
104verify: test lint ## Verify code quality
105
106docker-build: ## Build Docker image
107 docker build -t mcp-servers .
108
109docker-run: docker-build ## Run servers in Docker
110 docker run -it mcp-servers
111
112# Individual server targets
113git: $(BINDIR)/mcp-git ## Build git server only
114filesystem: $(BINDIR)/mcp-filesystem ## Build filesystem server only
115fetch: $(BINDIR)/mcp-fetch ## Build fetch server only
116memory: $(BINDIR)/mcp-memory ## Build memory server only
117sequential-thinking: $(BINDIR)/mcp-sequential-thinking ## Build sequential-thinking server only
118time: $(BINDIR)/mcp-time ## Build time server only
119maildir: $(BINDIR)/mcp-maildir ## Build maildir server only
120signal: $(BINDIR)/mcp-signal ## Build signal server only
121gitlab: $(BINDIR)/mcp-gitlab ## Build gitlab server only
122imap: $(BINDIR)/mcp-imap ## Build imap server only
123bash: $(BINDIR)/mcp-bash ## Build bash server only
124speech: $(BINDIR)/mcp-speech ## Build speech server only
125
126help: ## Show this help message
127 @echo "Go MCP Servers - Available targets:"
128 @echo ""
129 @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}'
130 @echo ""
131 @echo "Individual servers:"
132 @echo " git, filesystem, fetch, memory, sequential-thinking, time, maildir, signal, gitlab, imap, bash, speech"