mcpField
M
mcp-go-starter

mcp-go-starter

Local
github.com/SamMorrowDrumsDeveloper Tools7Updated 4w ago

About mcp-go-starter

mcp-go-starter is a Go template for building MCP servers with the official Go SDK. It demonstrates tools, resources, templates, prompts, progress updates, and both stdio and HTTP transports for developers learning or prototyping server implementations.

Key features

  1. 01Examples of tools, resources, and prompts
  2. 02Resource templates and dynamic tools
  3. 03Progress update example
  4. 04stdio and HTTP transports
  5. 05VS Code configuration

Use cases

  1. 01Learn MCP server implementation in Go
  2. 02Prototype a server with common MCP features
  3. 03Test tools and resources in VS Code
  4. 04Inspect MCP messages and schemas

MCP support

The starter implements an MCP server with example tools, resources, templates, and prompts, using stdio or HTTP transport.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

mcp.json · Universal config
{
"mcpServers": {
"go-starter": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/inspector"
]
}
}
}
Run commandnpx -y @modelcontextprotocol/inspector

Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.

Packages
npm@modelcontextprotocol/inspector

Tools

No tool list yet

Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.

Details

From the project README

MCP Go Starter

CI Go Report Card Go Version License: MIT MCP

A feature-complete Model Context Protocol (MCP) server template in Go using the official go-sdk. This starter demonstrates all major MCP features with clean, idiomatic Go code.

📚 Documentation

✨ Features

CategoryFeatureDescription
ToolshelloBasic tool with annotations
get_weatherTool returning structured data
ask_llmTool that invokes LLM sampling
long_taskTool with 5-second progress updates
load_bonus_toolDynamically loads a new tool
Resourcesinfo://aboutStatic informational resource
file://example.mdFile-based markdown resource
Templatesgreeting://{name}Personalized greeting
data://items/{id}Data lookup by ID
PromptsgreetGreeting in various styles
code_reviewCode review with focus areas

MCP sampling (ask_llm) is deprecated as of protocol version 2026-07-28 (SEP-2577). This workshop keeps the example during the supported deprecation window; new production servers should call LLM provider APIs directly.

🚀 Quick Start

Prerequisites

Air and goimports are pinned in tools/go.mod, including their transitive dependencies, and updated by Dependabot alongside the server modules. Install them with go -C tools install tool.

Installation
# Clone the repository
git clone https://github.com/SamMorrowDrums/mcp-go-starter.git
cd mcp-go-starter

# Download dependencies
go mod download
Running the Server

stdio transport (for local development):

go run ./cmd/stdio
# Or: make run-stdio

HTTP transport (for remote/web deployment):

go run ./cmd/http
# Or: make run-http
# Server runs on http://localhost:3000

The HTTP endpoint requires JSON requests and rejects cross-origin browser requests. Native MCP clients without an Origin header and same-origin browser clients remain supported.

Building Binaries
make build
# Creates bin/stdio and bin/http

🔧 VS Code Integration

This project includes VS Code configuration for seamless development:

  1. Open the project in VS Code
  2. The MCP configuration is in .vscode/mcp.json
  3. Build with Ctrl+Shift+B (or Cmd+Shift+B on Mac)
  4. Test the server using VS Code's MCP tools
Using DevContainers
  1. Install the Dev Containers extension
  2. Open command palette: "Dev Containers: Reopen in Container"
  3. Everything is pre-configured and ready to use!

📁 Project Structure

.
├── cmd/
│   ├── stdio/
│   │   └── main.go        # stdio transport entrypoint
│   └── http/
│       └── main.go        # HTTP transport entrypoint
├── internal/
│   └── server/
│       ├── server.go      # Server orchestration
│       ├── tools.go       # Tool definitions (hello, get_weather, etc.)
│       ├── resources.go   # Resource and template definitions
│       └── prompts.go     # Prompt definitions
├── .vscode/
│   ├── mcp.json           # MCP server configuration
│   ├── tasks.json         # Build/run tasks
│   └── extensions.json
├── .devcontainer/
│   └── devcontainer.json
├── .air.toml              # Live reload configuration
├── .golangci.yml          # Linter configuration
├── go.mod
├── Makefile
└── README.md

🛠️ Development

# Development with live reload (recommended)
make dev
# Requires air: go install github.com/air-verse/air@latest

# Run without live reload
make run-stdio

# Run tests
make test

# Format code
make fmt

# Lint code
make lint

# Install all dev tools
make install-tools

# Clean build artifacts
make clean
Live Reload

Install air for automatic rebuilds:

go install github.com/air-verse/air@latest
make dev

Changes to any .go file will automatically rebuild and restart the server.

🔍 MCP Inspector

The MCP Inspector is an essential development tool for testing and debugging MCP servers.

Running Inspector
npx @modelcontextprotocol/inspector -- go run ./cmd/stdio/main.go
What Inspector Provides
  • Tools Tab: List and invoke all registered tools with parameters
  • Resources Tab: Browse and read resources and templates
  • Prompts Tab: View and test prompt templates
  • Logs Tab: See JSON-RPC messages between client and server
  • Schema Validation: Verify tool input/output schemas
Debugging Tips
  1. Start Inspector before connecting your IDE/client
  2. Use the "Logs" tab to see exact request/response payloads
  3. Test tool annotations (ToolAnnotations) are exposed correctly
  4. Verify progress notifications appear for long_task
  5. Check that sampling works with ask_llm

📖 Feature Examples

Tool with Annotations
mcp.AddTool(server, &mcp.Tool{
    Name:        "hello",
    Title:       "Say Hello",
    Description: "A friendly greeting tool",
    Annotations: &mcp.ToolAnnotations{
        ReadOnlyHint: ptr(true),
    },
}, helloHandler)

func helloHandler(ctx context.Context, req *mcp.CallToolRequest, input helloInput) (*mcp.CallToolResult, any, error) {
    return &mcp.CallToolResult{
        Content: []mcp.Content{
            &mcp.TextContent{Text: fmt.Sprintf("Hello, %s!", input.Name)},
        },
    }, nil, nil
}
Resource Template
server.AddResourceTemplate(&mcp.ResourceTemplate{
    Name:        "Personalized Greeting",
    URITemplate: "greeting://{name}",
    MIMEType:    "text/plain",
}, greetingHandler)
Tool with Progress Updates
func longTaskHandler(ctx context.Context, req *mcp.CallToolRequest, input longTaskInput) (*mcp.CallToolResult, any, error) {
    progressToken := req.Params.GetProgressToken()
    
    for i := 0; i < 5; i++ {
        req.Session.NotifyProgress(ctx, &mcp.ProgressNotificationParams{
            ProgressToken: progressToken,
            Progress:      float64(i) / 5.0,
            Total:         1.0,
        })
        time.Sleep(time.Second)
    }
    
    return &mcp.CallToolResult{
        Content: []mcp.Content{&mcp.TextContent{Text: "Done!"}},
    }, nil, nil
}
Tool with Sampling
result, err := req.Session.CreateMessage(ctx, &mcp.CreateMessageParams{
    Messages: []*mcp.SamplingMessage{
        {Role: "user", Content: &mcp.TextContent{Text: prompt}},
    },
    MaxTokens: 100,
})

🔐 Environment Variables

Copy .env.example to .env and configure:

cp .env.example .env
VariableDescriptionDefault
PORTHTTP server port3000

🤝 Contributing

Contributions welcome! Please ensure your changes maintain feature parity with other language starters.

📄 License

MIT License - see LICENSE for details.

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.