GoMCP
GoMCP
Быстрый и идиоматичный способ создания MCP-серверов на Go.
🚀 Быстрые ссылки
Протокол MCP: https://modelcontextprotocol.io
Related MCP server: Filesystem MCP Server
🎯 Что такое GoMCP?
GoMCP — это фреймворк для создания серверов Model Context Protocol (MCP), а не просто SDK. Думайте о нем как о «Gin для MCP».
MCP — это открытый протокол, который позволяет ИИ-приложениям (Claude Desktop, Cursor, Kiro, VS Code Copilot) вызывать внешние инструменты, читать источники данных и использовать шаблоны промптов. GoMCP делает создание таких серверов тривиальной задачей.
Почему GoMCP?
mcp-go (mark3labs) | Официальный Go SDK | GoMCP | |
Уровень | SDK | SDK | Фреймворк |
Генерация схемы | Вручную | Тег | |
Middleware | Базовые хуки | Нет | Полная цепочка (Logger, Auth, RateLimit, OTel…) |
Группы инструментов | Нет | Нет | |
Импорт маршрутов Gin | Нет | Нет | ✅ Одной строкой |
Импорт OpenAPI/Swagger | Нет | Нет | ✅ Одной строкой |
Импорт gRPC сервисов | Нет | Нет | ✅ |
Встроенная аутентификация | Нет | Нет | Bearer, API Key, Basic + RBAC |
Инспектор UI | Нет | Нет | ✅ |
Тестовые утилиты | Базовые | Нет |
🛠️ Технологический стек
Системные требования
Требование | Версия |
Go | ≥ 1.25 |
Протокол MCP | 2024-11-05 (обратная совместимость с 2025-11-25) |
Основные зависимости
Технология | Описание |
Стандартная библиотека Go | Ядро фреймворка — ноль внешних зависимостей |
Gin | Только адаптер — импорт существующих маршрутов Gin |
gRPC | Только адаптер — импорт gRPC сервисов |
OpenTelemetry | Опционально — распределенная трассировка |
YAML v3 | Только провайдер — горячая перезагрузка определений инструментов |
🌟 Основные возможности
🔧 Разработка инструментов
Автоматическая схема через теги структур — определяйте параметры с помощью структур Go и тегов
mcp, JSON Schema генерируется автоматическиТипизированные обработчики —
func(*Context, Input) (Output, error)— никакой ручной обработки параметровВалидация параметров — required, min/max, enum, pattern — проверяется до запуска вашего обработчика
Версионирование компонентов — регистрируйте несколько версий, клиенты вызывают
name@versionАсинхронные задачи — долго выполняющиеся инструменты возвращают ID задачи с возможностью опроса и отмены
🔌 Адаптеры (Ключевое отличие)
Адаптер Gin — импорт существующих маршрутов Gin как инструментов MCP одной строкой
Адаптер OpenAPI — генерация инструментов из документации Swagger/OpenAPI 3.x
Адаптер gRPC — импорт методов gRPC сервисов как инструментов MCP
🔐 Безопасность
BearerAuth — валидация JWT токенов
APIKeyAuth — валидация API ключа через заголовок
BasicAuth — HTTP Basic аутентификация
RequireRole / RequirePermission — RBAC авторизация для групп инструментов
🧩 Возможности фреймворка
Цепочка middleware — Logger, Recovery, RequestID, Timeout, RateLimit, OpenTelemetry
Группы инструментов — организация инструментов с префиксами и middleware на уровне группы
Ресурсы и промпты — полная поддержка MCP, включая шаблоны URI и параметризованные промпты
Автодополнение — подсказки значений для аргументов промптов/ресурсов
🚀 Готовность к продакшену
Множественные транспорты — stdio (Claude Desktop, Cursor, Kiro) и Streamable HTTP с SSE
MCP Inspector — встроенный веб-интерфейс для отладки, просмотра и тестирования инструментов
Горячая перезагрузка — загрузка определений инструментов из YAML-файлов с отслеживанием изменений
Пакет
mcptest— in-memory клиент для модульного тестирования с поддержкой снапшотов
🏗️ Архитектура
┌──────────────────────────────────────────────────────────────┐
│ User Code │
│ s.Tool() / s.ToolFunc() / s.Resource() / s.Prompt() │
├──────────────────────────────────────────────────────────────┤
│ Framework Core │
│ Router → Middleware Chain → Validation → Handler → Result │
├────────────┬─────────────┬───────────────┬───────────────────┤
│ Schema │ Validator │ Adapters │ Observability │
│ Generator │ Engine │ Gin/OpenAPI/ │ OTel / Logger │
│ (mcp tags) │ (auto) │ gRPC │ / Inspector │
├────────────┴─────────────┴───────────────┴───────────────────┤
│ Protocol Layer │
│ JSON-RPC 2.0 / MCP / Capability Negotiation │
├──────────────────────────────────────────────────────────────┤
│ Transport Layer │
│ stdio / Streamable HTTP + SSE │
└──────────────────────────────────────────────────────────────┘Структура проекта
gomcp/
├── server.go # Server core, tool/resource/prompt registration
├── context.go # Request context with typed accessors
├── group.go # Tool groups with prefix naming
├── middleware.go # Middleware interface and chain execution
├── middleware_builtin.go # Logger, Recovery, RequestID, Timeout, RateLimit
├── middleware_auth.go # BearerAuth, APIKeyAuth, BasicAuth, RBAC
├── middleware_otel.go # OpenTelemetry tracing
├── schema/ # struct tag → JSON Schema generator + validator
├── transport/ # stdio + Streamable HTTP
├── adapter/ # Gin, OpenAPI, gRPC adapters
├── mcptest/ # Testing utilities
├── task.go # Async task support
├── completion.go # Auto-completions
├── inspector.go # Web debug UI
├── provider.go # Hot-reload from YAML
└── examples/ # Working examples📦 Установка
go get github.com/zhangpanda/gomcp⚡ Быстрый старт
5 строк до рабочего MCP-сервера
package main
import (
"fmt"
"github.com/zhangpanda/gomcp"
)
type SearchInput struct {
Query string `json:"query" mcp:"required,desc=Search keyword"`
Limit int `json:"limit" mcp:"default=10,min=1,max=100"`
}
type SearchResult struct {
Items []string `json:"items"`
Total int `json:"total"`
}
func main() {
s := gomcp.New("my-server", "1.0.0")
s.ToolFunc("search", "Search documents by keyword", func(ctx *gomcp.Context, in SearchInput) (SearchResult, error) {
items := []string{fmt.Sprintf("Result for %q", in.Query)}
return SearchResult{Items: items, Total: len(items)}, nil
})
s.Stdio()
}Структура SearchInput автоматически генерирует эту JSON Schema:
{
"type": "object",
"properties": {
"query": { "type": "string", "description": "Search keyword" },
"limit": { "type": "integer", "default": 10, "minimum": 1, "maximum": 100 }
},
"required": ["query"]
}Некорректные параметры отклоняются до запуска вашего обработчика:
validation failed: query: required; limit: must be <= 100📖 Руководство по использованию
Справочник тегов структур
Тег | Тип | Описание | Пример | |
| флаг | Поле обязательно для заполнения |
| |
| строка | Человекочитаемое описание |
| |
| любой | Значение по умолчанию |
| |
| число | Минимальное значение (включительно) |
| |
| число | Максимальное значение (включительно) |
| |
| строка | Допустимые значения через пайп | `mcp:"enum=asc | desc"` |
| строка | Валидация через регулярное выражение |
|
Комбинирование: mcp:"required,desc=Email пользователя,pattern=^[^@]+@[^@]+$"
Поддерживаемые типы: string, int, float64, bool, []T, вложенные структуры.
Инструменты
Простой обработчик:
s.Tool("hello", "Say hello", func(ctx *gomcp.Context) (*gomcp.CallToolResult, error) {
return ctx.Text("Hello, " + ctx.String("name")), nil
})Типизированный обработчик (рекомендуется):
type Input struct {
Name string `json:"name" mcp:"required,desc=User name"`
Email string `json:"email" mcp:"required,pattern=^[^@]+@[^@]+$"`
}
s.ToolFunc("create_user", "Create user", func(ctx *gomcp.Context, in Input) (User, error) {
return db.CreateUser(in.Name, in.Email)
})Ресурсы
// Static
s.Resource("config://app", "App config", func(ctx *gomcp.Context) (any, error) {
return map[string]any{"version": "1.0"}, nil
})
// Dynamic URI template
s.ResourceTemplate("db://{table}/{id}", "DB record", func(ctx *gomcp.Context) (any, error) {
return db.Find(ctx.String("table"), ctx.String("id")), nil
})Промпты
s.Prompt("code_review", "Code review",
[]gomcp.PromptArgument{gomcp.PromptArg("language", "Language", true)},
func(ctx *gomcp.Context) ([]gomcp.PromptMessage, error) {
return []gomcp.PromptMessage{
gomcp.UserMsg(fmt.Sprintf("Review this %s code for bugs.", ctx.String("language"))),
}, nil
},
)Middleware
s.Use(gomcp.Logger()) // Log tool name + duration
s.Use(gomcp.Recovery()) // Recover from panics
s.Use(gomcp.RequestID()) // Unique request ID
s.Use(gomcp.Timeout(10 * time.Second)) // Deadline enforcement
s.Use(gomcp.RateLimit(100)) // 100 calls/minute
s.Use(gomcp.OpenTelemetry()) // Distributed tracing
s.Use(gomcp.BearerAuth(tokenValidator)) // JWT auth
s.Use(gomcp.APIKeyAuth("X-API-Key", keyValidator)) // API key authПользовательское middleware:
func AuditLog() gomcp.Middleware {
return func(ctx *gomcp.Context, next func() error) error {
start := time.Now()
err := next()
log.Printf("tool=%s duration=%s err=%v", ctx.String("_tool_name"), time.Since(start), err)
return err
}
}Группы инструментов
user := s.Group("user", authMiddleware)
user.Tool("get", "Get user", getUser) // → user.get
user.Tool("update", "Update user", updateUser) // → user.update
admin := user.Group("admin", gomcp.RequireRole("admin"))
admin.Tool("delete", "Delete user", deleteUser) // → user.admin.deleteАдаптеры
Gin — одна строка для импорта вашего существующего API:
adapter.ImportGin(s, ginRouter, adapter.ImportOptions{
IncludePaths: []string{"/api/v1/"},
})
// GET /api/v1/users/:id → Tool get_api_v1_users_by_id (id = required param)OpenAPI — генерация из Swagger-документации:
adapter.ImportOpenAPI(s, "./swagger.yaml", adapter.OpenAPIOptions{
TagFilter: []string{"pets"},
ServerURL: "https://api.example.com",
})gRPC:
adapter.ImportGRPC(s, grpcConn, adapter.GRPCOptions{
Services: []string{"user.UserService"},
})Версионирование компонентов
s.ToolFunc("search", "v1", searchV1, gomcp.Version("1.0"))
s.ToolFunc("search", "v2 with embeddings", searchV2, gomcp.Version("2.0"))
// "search" → latest, "search@1.0" → exact versionАсинхронные задачи
s.AsyncTool("report", "Generate report", func(ctx *gomcp.Context) (*gomcp.CallToolResult, error) {
// long-running work
return ctx.Text("done"), nil
})
// Client gets taskId immediately, polls tasks/get, can tasks/cancelГорячая перезагрузка
s.LoadDir("./tools/", gomcp.DirOptions{Watch: true})MCP Inspector
s.Dev(":9090") // http://localhost:9090 — browse and test all toolsТестирование
func TestSearch(t *testing.T) {
c := mcptest.NewClient(t, setupServer())
c.Initialize()
result := c.CallTool("search", map[string]any{"query": "golang"})
result.AssertNoError(t)
result.AssertContains(t, "golang")
mcptest.MatchSnapshot(t, "search_result", result)
}Транспорты
s.Stdio() // Claude Desktop, Cursor, Kiro
s.HTTP(":8080") // Remote deployment with SSE
s.Handler() // Embed in existing HTTP serverИспользование с ИИ-клиентами
{
"mcpServers": {
"my-server": {
"command": "/path/to/your/binary"
}
}
}Работает с Claude Desktop, Cursor, Kiro, Windsurf, VS Code Copilot и любым MCP-совместимым клиентом.
📋 Дорожная карта
[x] Ядро: Tool, Resource, Prompt с полной поддержкой протокола MCP
[x] Автогенерация схемы через теги структур + валидация параметров
[x] Цепочка middleware (Logger, Recovery, RateLimit, Timeout, RequestID)
[x] Middleware аутентификации (Bearer / API Key / Basic) + RBAC авторизация
[x] Группы инструментов с префиксами и вложенными группами
[x] Транспорты stdio + Streamable HTTP с уведомлениями SSE
[x] Адаптер Gin — импорт существующих маршрутов Gin как инструментов MCP
[x] Адаптер OpenAPI — генерация инструментов из документации Swagger/OpenAPI
[x] Адаптер gRPC — импорт gRPC сервисов как инструментов MCP
[x] Интеграция OpenTelemetry
[x] Пакет
mcptestсо снапшот-тестированием[x] Версионирование компонентов + устаревание
[x] Асинхронные задачи с опросом и отменой
[x] Веб-интерфейс отладки MCP Inspector
[x] Провайдер горячей перезагрузки из YAML
[x] Автодополнение для аргументов промптов/ресурсов
[ ] Поддержка MCP-клиента (вызовы от сервера к серверу)
🤝 Обратная связь и поддержка
Сообщения об ошибках: GitHub Issues
Запросы функций: GitHub Issues
Обсуждения: GitHub Discussions
💡 Рекомендуемое чтение: Как задавать вопросы правильно
⚖️ Авторские права и лицензия
Copyright © 2026 GoMCP Contributors
Лицензировано под Apache License 2.0.
Важные примечания
Этот проект является открытым и бесплатным как для личного, так и для коммерческого использования под лицензией Apache 2.0.
Вы обязаны сохранить уведомление об авторских правах, текст лицензии и любые уведомления об авторстве во всех копиях или существенных частях программного обеспечения.
Лицензия Apache 2.0 включает прямое предоставление патентных прав от участников пользователям.
Вклады в этот проект лицензируются на условиях той же лицензии Apache 2.0.
Несанкционированное удаление уведомлений об авторских правах может привести к судебному преследованию.
Патентное уведомление
Некоторые функции этого фреймворка (генерация схемы через теги структур, автоматический адаптер HTTP-to-MCP, автоматический адаптер OpenAPI-to-MCP) являются предметом поданных патентных заявок. Лицензия Apache 2.0 предоставляет вам бессрочную, всемирную, безвозмездную патентную лицензию на использование этих функций как части данного программного обеспечения.
⭐ История звезд
Если вы находите GoMCP полезным, пожалуйста, поставьте звезду! Это помогает другим узнать о проекте.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/zhangpanda/gomcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server