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"