Перейти к содержимому
Выберите тему

Go SDK

Официальный Go SDK для MCP - выпуск v1.8.0, установка, редакции протокола, поведение клиента по умолчанию и условие, при котором HTTP-сервер принимает 2026-07-28.

сверено с выпуском v1.8.0 4 октября 2026

Это SDK из репозитория modelcontextprotocol/go-sdk. README выпуска называет его реализацией официального Go SDK для MCP, а список официальных SDK относит его к первому уровню (Tier 1).

У SDK одна ветка, 1.x. Модуль состоит из нескольких пакетов:

Пакет Для чего
mcp основной программный интерфейс клиентов и серверов
jsonrpc для тех, кто пишет собственный транспорт
auth базовые средства для OAuth
oauthex дополнения к OAuth, например метаданные защищённого ресурса

У выпуска v1.8.0 две даты, и обе первичные: метка поставлена на изменение от 4 сентября 2026 (это время показывает прокси модулей Go), а выпуск на GitHub опубликован 14 сентября 2026.

В README выпуска команды установки нет. Она есть в кратком руководстве:

Установка
go get github.com/modelcontextprotocol/go-sdk/mcp

В go.mod выпуска записано go 1.25.0. По README, новые выпуски SDK рассчитаны только на поддерживаемые версии Go.

Список версий в mcp/shared.go: 2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05. Таблица совместимости в README говорит то же и уточняет: редакция 2026-07-28 поддерживается начиная с v1.7.0, а OAuth на стороне клиента имеет опытную поддержку.

Для вас это значит: по документу о протоколе, SDK поддерживает обе модели жизненного цикла и выбирает одну по согласованной версии, а программный интерфейс при этом один и тот же. Чем эпохи различаются, описано на странице о версиях протокола.

По документу о протоколе, Client.Connect сначала вызывает server/discover и по ответу выбирает общую версию. Если запрос не удался или сервер не поддерживает самую новую версию, клиент переходит на старое рукопожатие initialize. В mcp/client.go видно, что откат идёт с версией 2025-11-25.

Версию задаёт поле ClientSessionOptions.ProtocolVersion. По комментарию в коде, это версия, которую клиент отправляет в запросе initialize или server/discover; если поле пустое, берётся самая новая поддерживаемая. По тому же коду, server/discover отправляется только тогда, когда запрошена версия не старше 2026-07-28. Значит, если указать в этом поле версию старой эпохи, клиент сразу начнёт с initialize.

Клиент
package main
import (
"context"
"log"
"os/exec"
"github.com/modelcontextprotocol/go-sdk/mcp"
)
func main() {
ctx := context.Background()
// Create a new client, with no features.
client := mcp.NewClient(&mcp.Implementation{Name: "mcp-client", Version: "v1.0.0"}, nil)
// Connect to a server over stdin/stdout.
transport := &mcp.CommandTransport{Command: exec.Command("myserver")}
session, err := client.Connect(ctx, transport, nil)
if err != nil {
log.Fatal(err)
}
defer session.Close()
// Call a tool on the server.
params := &mcp.CallToolParams{
Name: "greet",
Arguments: map[string]any{"name": "you"},
}
res, err := session.CallTool(ctx, params)
if err != nil {
log.Fatalf("CallTool failed: %v", err)
}
if res.IsError {
log.Fatal("tool failed")
}
for _, c := range res.Content {
log.Print(c.(*mcp.TextContent).Text)
}
}

Пример взят из документации выпуска v1.8.0 и здесь не запускался.

Третий аргумент Connect в примере равен nil. Это и есть поведение по умолчанию: сначала server/discover, потом при необходимости initialize.

По документу о протоколе, Server.Connect сам регистрирует обработчик server/discover. Сервер объявляет и согласует все версии, которые поддерживает SDK. Сузить набор можно полем ServerOptions.SupportedProtocolVersions, например чтобы перестать обслуживать редакцию, от которой вы отказались.

В старой модели запросы к серверу отклоняются, пока клиент не завершит рукопожатие. В новой модели рукопожатия нет: сервер обрабатывает первый же запрос и проверяет поля _meta в нём.

Сервер на stdio
package main
import (
"context"
"log"
"github.com/modelcontextprotocol/go-sdk/mcp"
)
type Input struct {
Name string `json:"name" jsonschema:"the name of the person to greet"`
}
type Output struct {
Greeting string `json:"greeting" jsonschema:"the greeting to tell to the user"`
}
func SayHi(ctx context.Context, req *mcp.CallToolRequest, input Input) (
*mcp.CallToolResult,
Output,
error,
) {
return nil, Output{Greeting: "Hi " + input.Name}, nil
}
func main() {
// Create a server with a single tool.
server := mcp.NewServer(&mcp.Implementation{Name: "greeter", Version: "v1.0.0"}, nil)
mcp.AddTool(server, &mcp.Tool{Name: "greet", Description: "say hi"}, SayHi)
// Run the server over stdin/stdout, until the client disconnects.
if err := server.Run(context.Background(), &mcp.StdioTransport{}); err != nil {
log.Fatal(err)
}
}

Пример взят из документации выпуска v1.8.0 и здесь не запускался.

Как совместить обе эпохи на одном адресе, разобрано на странице о сервере двух эпох.

Tasks. В выпуске v1.8.0 расширение не реализовано. В плане развития есть только пункт об опытной реализации задач по более раннему предложению SEP-1686. Строк tasks/get, io.modelcontextprotocol/tasks и SEP-2663 в исходниках и документации выпуска нет.

MCP Apps. Неизвестно. Поиск по исходникам и документации выпуска не нашёл ни упоминаний MCP Apps, ни идентификатора io.modelcontextprotocol/ui, ни ресурсов ui://. Заявления проекта о поддержке или об отказе от неё тоже нет.

Что такое расширения и как о них договариваются стороны - на странице о расширениях.

  • Roots, Sampling, Logging. По README, эти возможности устарели с редакции 2026-07-28, а SDK продолжает их поддерживать в течение срока устаревания - не меньше двенадцати месяцев.
  • HTTP+SSE. Старый транспорт из двух адресов по-прежнему реализован: SSEHandler и парные ему типы. Документ о протоколе советует для новых развёртываний Streamable HTTP.
  • Сеансы и initialize. Сохранены для версий старой эпохи. Возобновление потока через EventStore и Last-Event-ID тоже оставлено только для 2025-11-25 и более ранних версий.
  • Динамическая регистрация клиента. Перечислена среди поддерживаемых способов регистрации. Помечена ли она в выпуске как устаревшая, неизвестно.

Общий список - на странице об устаревших возможностях.

На 4 октября 2026 ветка main опережает метку v1.8.0 на 41 изменение. Список версий протокола тот же, но среди невыпущенных изменений много правок поведения в сети: определение версии запроса, отказ в вызове на старом сеансе до initialize, запись согласованной версии, разбор заголовков Mcp-Name и Mcp-Param-*. В выпуске v1.8.0 этих правок нет. Пробных выпусков новее v1.8.0 нет.

  • Реализовано ли расширение MCP Apps: в выпуске нет ни кода, ни заявления.
  • Есть ли у клиента настройка, которая запрещает откат на initialize: в документации выпуска она не описана.
  • Помечена ли динамическая регистрация клиента как устаревшая в коде выпуска.
  • Содержимое архива модуля отдельно не проверялось: сверялись исходники по метке выпуска и данные прокси модулей.