Go MCP Server Generator
GitHubOfficialOriginally contributed by @troystaylor as prompts/go-mcp-server-generator.prompt.md; moved into a skill by pull request #761Distributed by GitHub
- Skill
- Content generator
- Software development
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a standardized template and workflow for scaffolding Model Context Protocol (MCP) servers in Go. It ensures developers follow best practices, including proper project structure, dependency management using the official Go SDK, type-safe tool definitions, graceful shutdown handling, and integrated testing patterns.
What it does
- Initializes a Go module with the official MCP SDK dependency.
- Creates a modular project structure separating tools, configuration, and main logic.
- Provides boilerplate for tool registration and handler implementation.
- Implements graceful shutdown logic using context and OS signals.
- Generates a README template with configuration and usage documentation.
- Includes a testing template for validating tool handler logic.
When to use it
- When starting a new MCP server project in Go.
- When you need a consistent, production-ready architecture for your MCP tools.
- When you want to ensure your MCP server handles context and signals correctly.
Advantages
- Reduces boilerplate setup time for new MCP projects.
- Enforces consistent project structure and coding patterns.
- Promotes type safety through struct-based input/output definitions.
- Includes built-in support for testing and configuration management.
Usage examples
- “Generate a new Go MCP server project named 'file-manager-mcp'.”
- The agent creates a directory structure with a go.mod file, main.go, and the necessary tool/config packages, pre-configured for the MCP SDK.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/github/go-mcp-server-generator/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip go-mcp-server-generator.zip -d .agents/skills
Documentation by troystaylor
Go MCP Server Project Generator
Generate a complete, production-ready Model Context Protocol (MCP) server project in Go.
Project Requirements
You will create a Go MCP server with:
Project Structure: Proper Go module layout
Dependencies: Official MCP SDK and necessary packages
Server Setup: Configured MCP server with transports
Tools: At least 2-3 useful tools with typed inputs/outputs
Error Handling: Proper error handling and context usage
Documentation: README with setup and usage instructions
Testing: Basic test structure
Template Structure
myserver/
├── go.mod
├── go.sum
├── main.go
├── tools/
│ ├── tool1.go
│ └── tool2.go
├── resources/
│ └── resource1.go
├── config/
│ └── config.go
├── README.md
└── main_test.gogo.mod Template
module github.com/yourusername/{{PROJECT_NAME}}
go 1.23
require (
github.com/modelcontextprotocol/go-sdk v1.0.0
)main.go Template
package main
import (
"context"
"log"
"os"
"os/signal"
"syscall"
"github.com/modelcontextprotocol/go-sdk/mcp"
"github.com/yourusername/{{PROJECT_NAME}}/config"
"github.com/yourusername/{{PROJECT_NAME}}/tools"
)
func main() {
cfg := config.Load()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// Handle graceful shutdown
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM)
go func() {
<-sigCh
log.Println("Shutting down...")
cancel()
}()
// Create server
server := mcp.NewServer(
&mcp.Implementation{
Name: cfg.ServerName,
Version: cfg.Version,
},
&mcp.Options{
Capabilities: &mcp.ServerCapabilities{
Tools: &mcp.ToolsCapability{},
Resources: &mcp.ResourcesCapability{},
Prompts: &mcp.PromptsCapability{},
},
},
)
// Register tools
tools.RegisterTools(server)
// Run server
transport := &mcp.StdioTransport{}
if err := server.Run(ctx, transport); err != nil {
log.Fatalf("Server error: %v", err)
}
}tools/tool1.go Template
package tools
import (
"context"
"fmt"
"github.com/modelcontextprotocol/go-sdk/mcp"
)
type Tool1Input struct {
Param1 string `json:"param1" jsonschema:"required,description=First parameter"`
Param2 int `json:"param2,omitempty" jsonschema:"description=Optional second parameter"`
}
type Tool1Output struct {
Result string `json:"result" jsonschema:"description=The result of the operation"`
Status string `json:"status" jsonschema:"description=Operation status"`
}
func Tool1Handler(ctx context.Context, req *mcp.CallToolRequest, input Tool1Input) (
*mcp.CallToolResult,
Tool1Output,
error,
) {
// Validate input
if input.Param1 == "" {
return nil, Tool1Output{}, fmt.Errorf("param1 is required")
}
// Check context
if ctx.Err() != nil {
return nil, Tool1Output{}, ctx.Err()
}
// Perform operation
result := fmt.Sprintf("Processed: %s", input.Param1)
return nil, Tool1Output{
Result: result,
Status: "success",
}, nil
}
func RegisterTool1(server *mcp.Server) {
mcp.AddTool(server,
&mcp.Tool{
Name: "tool1",
Description: "Description of what tool1 does",
},
Tool1Handler,
)
}tools/registry.go Template
package tools
import "github.com/modelcontextprotocol/go-sdk/mcp"
func RegisterTools(server *mcp.Server) {
RegisterTool1(server)
RegisterTool2(server)
// Register additional tools here
}config/config.go Template
package config
import "os"
type Config struct {
ServerName string
Version string
LogLevel string
}
func Load() *Config {
return &Config{
ServerName: getEnv("SERVER_NAME", "{{PROJECT_NAME}}"),
Version: getEnv("VERSION", "v1.0.0"),
LogLevel: getEnv("LOG_LEVEL", "info"),
}
}
func getEnv(key, defaultValue string) string {
if value := os.Getenv(key); value != "" {
return value
}
return defaultValue
}main_test.go Template
package main
import (
"context"
"testing"
"github.com/yourusername/{{PROJECT_NAME}}/tools"
)
func TestTool1Handler(t *testing.T) {
ctx := context.Background()
input := tools.Tool1Input{
Param1: "test",
Param2: 42,
}
result, output, err := tools.Tool1Handler(ctx, nil, input)
if err != nil {
t.Fatalf("Tool1Handler failed: %v", err)
}
if output.Status != "success" {
t.Errorf("Expected status 'success', got '%s'", output.Status)
}
if result != nil {
t.Error("Expected result to be nil")
}
}README.md Template
# {{PROJECT_NAME}}
A Model Context Protocol (MCP) server built with Go.
## Description
{{PROJECT_DESCRIPTION}}
## Installation
\`\`\`bash
go mod download
go build -o {{PROJECT_NAME}}
\`\`\`
## Usage
Run the server with stdio transport:
\`\`\`bash
./{{PROJECT_NAME}}
\`\`\`
## Configuration
Configure via environment variables:
- `SERVER_NAME`: Server name (default: "{{PROJECT_NAME}}")
- `VERSION`: Server version (default: "v1.0.0")
- `LOG_LEVEL`: Logging level (default: "info")
## Available Tools
### tool1
{{TOOL1_DESCRIPTION}}
**Input:**
- `param1` (string, required): First parameter
- `param2` (int, optional): Second parameter
**Output:**
- `result` (string): Operation result
- `status` (string): Status of the operation
## Development
Run tests:
\`\`\`bash
go test ./...
\`\`\`
Build:
\`\`\`bash
go build -o {{PROJECT_NAME}}
\`\`\`
## License
MITGeneration Instructions
When generating a Go MCP server:
Initialize Module: Create
go.modwith proper module pathStructure: Follow the template directory structure
Type Safety: Use structs with JSON schema tags for all inputs/outputs
Error Handling: Validate inputs, check context, wrap errors
Documentation: Add clear descriptions and examples
Testing: Include at least one test per tool
Configuration: Use environment variables for config
Logging: Use structured logging (log/slog)
Graceful Shutdown: Handle signals properly
Transport: Default to stdio, document alternatives
Best Practices
Keep tools focused and single-purpose
Use descriptive names for types and functions
Include JSON schema documentation in struct tags
Always respect context cancellation
Return descriptive errors
Keep main.go minimal, logic in packages
Write tests for tool handlers
Document all exported functions
Files
- ATTRIBUTION.mdAdded by AutoGineer1.1 KiB
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md6.9 KiB
Requirements and compatibility
Written for: GitHub Copilot
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Originally contributed by
@troystayloras prompts/go-mcp-server-generator.prompt.mdmoved into a skill by pull request #761
- Publisher
- GitHub (Official)
- Distributed by
- GitHub
- Source
- github/awesome-copilot · skills/go-mcp-server-generator · commit 797337f
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Contributors
- troystaylor
AutoGineer is not affiliated with or endorsed by troystaylor or GitHub.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download go-mcp-server-generator.zip