Skip to main content
Glama

GoMCP

Go Version License Release gomcp MCP server

Быстрый и идиоматичный способ создания MCP-серверов на Go.

中文文档


🚀 Быстрые ссылки


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

Фреймворк

Генерация схемы

Вручную

Тег jsonschema

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

📖 Руководство по использованию

Справочник тегов структур

Тег

Тип

Описание

Пример

required

флаг

Поле обязательно для заполнения

mcp:"required"

desc

строка

Человекочитаемое описание

mcp:"desc=Поисковый запрос"

default

любой

Значение по умолчанию

mcp:"default=10"

min

число

Минимальное значение (включительно)

mcp:"min=0"

max

число

Максимальное значение (включительно)

mcp:"max=100"

enum

строка

Допустимые значения через пайп

`mcp:"enum=asc

desc"`

pattern

строка

Валидация через регулярное выражение

mcp:"pattern=^[a-z]+$"

Комбинирование: 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-клиента (вызовы от сервера к серверу)


🤝 Обратная связь и поддержка

💡 Рекомендуемое чтение: Как задавать вопросы правильно


⚖️ Авторские права и лицензия

Copyright © 2026 GoMCP Contributors

Лицензировано под Apache License 2.0.

Важные примечания

  1. Этот проект является открытым и бесплатным как для личного, так и для коммерческого использования под лицензией Apache 2.0.

  2. Вы обязаны сохранить уведомление об авторских правах, текст лицензии и любые уведомления об авторстве во всех копиях или существенных частях программного обеспечения.

  3. Лицензия Apache 2.0 включает прямое предоставление патентных прав от участников пользователям.

  4. Вклады в этот проект лицензируются на условиях той же лицензии Apache 2.0.

  5. Несанкционированное удаление уведомлений об авторских правах может привести к судебному преследованию.

Патентное уведомление

Некоторые функции этого фреймворка (генерация схемы через теги структур, автоматический адаптер HTTP-to-MCP, автоматический адаптер OpenAPI-to-MCP) являются предметом поданных патентных заявок. Лицензия Apache 2.0 предоставляет вам бессрочную, всемирную, безвозмездную патентную лицензию на использование этих функций как части данного программного обеспечения.


⭐ История звезд

Если вы находите GoMCP полезным, пожалуйста, поставьте звезду! Это помогает другим узнать о проекте.

Install Server
A
security – no known vulnerabilities
A
license - permissive license
A
quality - A tier

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