VOOZH about

URL: https://glama.ai/mcp/servers/zhangpanda/gomcp?locale=ru-RU

⇱ GoMCP by zhangpanda | 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

тег mcp + автовалидация

Middleware

Базовые хуки

Нет

Полная цепочка (Logger, Auth, RateLimit, OTel…)

Группы инструментов

Нет

Нет

Да (user.get, admin.delete)

Импорт маршрутов Gin

Нет

Нет

✅ Одна строка

Импорт OpenAPI/Swagger

Нет

Нет

✅ Одна строка

Импорт gRPC сервисов

Нет

Нет

Встроенная аутентификация

Нет

Нет

Bearer, API Key, Basic + RBAC

Inspector UI

Нет

Нет

Утилиты для тестирования

Базовые

Нет

пакет mcptest


🛠️ Технологический стек

Системные требования

Требование

Версия

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 клиент для модульного тестирования с поддержкой снимков (snapshots)


🏗️ Архитектура

┌──────────────────────────────────────────────────────────────┐
│ 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] Ядро: Инструменты, Ресурсы, Промпты с полной поддержкой протокола 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 с тестированием через снимки (snapshots)

  • [x] Версионирование компонентов + устаревание (deprecation)

  • [x] Асинхронные задачи с опросом и отменой

  • [x] Веб-интерфейс отладки MCP Inspector

  • [x] Провайдер горячей перезагрузки из YAML

  • [x] Автодополнение для аргументов промптов/ресурсов


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

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


🔒 Безопасность

Чтобы сообщить об уязвимостях безопасности, см. SECURITY.md.


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

Copyright © 2026 Участники GoMCP

Лицензировано под 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 полезным, пожалуйста, поставьте звезду! Это помогает другим узнать о проекте.

A
license - permissive license
A
quality
A
maintenance

Maintenance

Maintainers
<1hResponse time
6dRelease cycle
3Releases (12mo)
Commit activity

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