The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Tiny Go MCP Server listing page.
A lightweight Model Context Protocol (MCP) toolkit for Go. Build spec-compliant MCP servers (stdio, streamable HTTP, legacy SSE) with tools, resources, and prompts — minimal boilerplate and automatic JSON Schema from Go structs.
Built on the official modelcontextprotocol/go-sdk.
Requirements: Go 1.26+ (download).
| Tiny Go MCP Server | Full frameworks | |
|---|---|---|
| Goal | Thin helper on official go-sdk + tiny static binary | Full MCP feature surface |
| Deps | Official go-sdk only | Varies |
| Binary | ~5MB stripped, no runtime on host | Often larger stacks |
| Schemas | Inferred from struct tags | Manual or builder APIs |
Use this project as a library (tinymcp package) or as a starting template (cmd/tiny-go-mcp).
| tinymcp (this repo) | mcp-go | go-sdk alone | |
|---|---|---|---|
| Best for | Thin helper on go-sdk, tiny binary | Rich helpers, large ecosystem | Full control, no extra layer |
| Schema | Struct tags → auto JSON Schema | Builder APIs / helpers | AddTool + generics yourself |
| Transport | stdio (Start()), streamable HTTP (StartHTTP), legacy SSE (StartSSE) | stdio, SSE, HTTP, … | All transports |
| Deps | go-sdk only | Standalone module | go-sdk only |
Choose tinymcp when you want the official protocol implementation with minimal boilerplate and a small static server binary.
tinymcp is a thin helper on the official go-sdk — not a replacement for it.
We reduce setup and transport boilerplate (server creation, registration error handling, stdio/HTTP/SSE, TextResult, deploy examples). The protocol implementation, generics, and schema inference still come from modelcontextprotocol/go-sdk.
That means handler code uses both imports — and that is intentional:
| Use tinymcp for | Use go-sdk (mcp) for |
|---|---|
NewServer, RegisterTool, transports | Handler signatures (CallToolRequest, GetPromptRequest, …) |
| Safe registration (errors, not panics) | Tool annotations, elicitation, custom protocol features |
TextResult, HTTP middleware helpers | Anything via server.RawServer() |
We are not aiming for a non-leaky facade that hides the SDK. If you need full control, call RawServer() or use go-sdk directly — same underlying server, no lock-in.
Same protocol implementation — tinymcp removes repetitive setup. Handler code still imports mcp for request types in both cases.
go-sdk alone (minimal stdio server):
tinymcp (same tool, less boilerplate):
| tinymcp adds | Still on go-sdk (mcp) |
|---|---|
NewServer(name, ver) | Handler signatures (CallToolRequest, prompts, resources) |
RegisterTool + struct-tag JSON Schema | Tool annotations via RegisterToolDef + mcp.Tool |
| Safe registration errors (no panics) | Advanced session / event-store APIs |
Start() / StartHTTP() / HTTP middleware | Full control via RawServer() |
Use go-sdk alone when you want zero wrapper. Use tinymcp when you want less setup while staying on the official implementation.
| Method | API | Typical clients |
|---|---|---|
| stdio (default) | Start() | Cursor, Claude Desktop, Windsurf (local subprocess) |
| Streamable HTTP | StartHTTP(addr, opts) or StreamableHTTPHandler | Remote MCP clients, gateways, browser tools |
| Legacy SSE | StartSSE(addr, opts) or SSEHandler | Older clients on MCP 2024-11-05 SSE transport |
Start() runs stdio (stdin/stdout) — what most local AI clients expect.
For HTTP/SSE, tinymcp wraps the official go-sdk handlers with minimal options:
Stateless mode (Stateless: true) is the default in examples: one POST JSON-RPC per request, no long-lived SSE GET stream, and no server-initiated messages. Omit it or use session options when you need full streamable HTTP sessions — see docs/HTTP.md.
See docs/HTTP.md and examples/http. To host for Smithery URL listing (no Docker for end users), use examples/http-deploy. For advanced session routing or event stores, use server.RawServer() with the go-sdk directly.
Step-by-step guide: docs/QUICKSTART.md. AI codegen: SYSTEM_PROMPT.md.
See examples/minimal for a runnable copy-paste example.
Requires tagged module template/ (v1.1.1+) for stdio, or template-http/ for streamable HTTP:
Or copy examples/minimal, template/, or template-http/ directly.
Both install paths produce a binary named tiny-go-mcp:
Or build from source (binary in the repo root):
| Method | Binary name | Typical path |
|---|---|---|
go install …/cmd/tiny-go-mcp | tiny-go-mcp | $(go env GOPATH)/bin/tiny-go-mcp |
make build / make release | tiny-go-mcp | ./tiny-go-mcp in the repo |
make install | tiny-go-mcp | $(go env GOPATH)/bin/tiny-go-mcp |
These tools exist for MCP integration demos, not production logic. Agents should compute math and write greetings in-chat unless they are explicitly testing tool calls.
| Tool | When to use | When not to / alternative | Arguments |
|---|---|---|---|
add | Test that the client can call an addition tool | Real arithmetic → compute locally or use a calculator MCP | a, b |
subtract | Test subtraction wiring (use instead of add for subtraction tests) | Real arithmetic → compute locally | a, b |
greet | Test a text-returning tool (use instead of add/subtract for messaging demos) | User-facing hello → reply in the conversation | name (required), greeting (optional) |
MCP servers communicate over stdio. Point your client at the compiled binary path.
Template config: examples/mcp-client-config.json (copy and set the absolute path to tiny-go-mcp).
Logging: The protocol uses stdin/stdout. Server logs (if any) go to stderr only. Set TINY_GO_MCP_VERBOSE=1 on the server process to enable startup log lines.
Settings → Features → MCP → Add server:
tiny-go-mcpstdio/absolute/path/to/tiny-go-mcpOr add to .cursor/mcp.json in your project:
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
Use the same shape: command = absolute path to tiny-go-mcp, transport = stdio. Refer to your client’s MCP docs for the config file location.
snake_case) and descriptions that say when to use, when not to, and which sibling tool applies — models pick tools from these and often have overlapping options.jsonschema tags on struct fields so argument docs appear in the schema.tinymcp.TextResult for predictable client display.Register read-only context and reusable prompt templates alongside tools:
Runnable example: examples/resources. For dynamic URI templates use RegisterResourceTemplate.
Documentation: pkg.go.dev/github.com/kioie/tiny-go-mcp-server/tinymcp. Upgrading from v1.1.x: docs/MIGRATION-v1.2.md.
| Command | Description |
|---|---|
make test | Run tests with race detector |
make lint | golangci-lint |
make lint-tools | Validate MCP tool descriptions in reference servers |
make coverage | Coverage report |
make build | Dev binary ./tiny-go-mcp |
make release | Stripped static binary |
make install | go install → $(go env GOPATH)/bin/tiny-go-mcp |
After make release, optionally pack with UPX:
Key docs in docs/:
| Doc | Purpose |
|---|---|
| QUICKSTART.md | Step-by-step library setup |
| HTTP.md | stdio vs streamable HTTP vs legacy SSE |
| STABILITY.md | Public API stability policy |
| MIGRATION-v1.2.md | Upgrade guide from v1.1.x |
| TLS.md | HTTPS via reverse proxy or Go |
| LOCALHOST-PROTECTION.md | DNS rebinding security advisory |
| DISCOVERY.md | Registries and visibility |
| GLAMA.md | Glama hosting |
| SMITHERY.md | Smithery URL and MCPB listings |
Tag a semver version (e.g. v1.2.0) to publish stable go get versions and trigger GitHub Releases with cross-platform binaries and multi-arch GHCR images. Release history: CHANGELOG.md. Public API stability: docs/STABILITY.md. Agent-facing API summary: SYSTEM_PROMPT.md. Upgrading from v1.1.x: docs/MIGRATION-v1.2.md.
See docs/DISCOVERY.md for MCP Registry (server.json), awesome lists, and community directories. Listing copy and launch posts: docs/SUBMISSIONS.md. For Glama hosting with Docker, see docs/GLAMA.md.
See CONTRIBUTING.md. For AI codegen outside this repo, see SYSTEM_PROMPT.md. CI runs tests, lint, and CodeQL; Dependabot keeps Go and Actions dependencies updated.
MIT — see LICENSE.