# MCP Go SDK: установка, версии и редакции протокола

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

Страница: https://mcpdoc.ru/sdk/go/
Указатель сайта: https://mcpdoc.ru/llms.txt

Go SDK - официальный модуль `github.com/modelcontextprotocol/go-sdk` для серверов и клиентов MCP. Выпуск v1.8.0 понимает обе эпохи протокола. Клиент по умолчанию сначала вызывает `server/discover` и при неудаче сам переходит на рукопожатие `initialize`. Сервер по Streamable HTTP принимает редакцию 2026-07-28 только при включённой настройке `Stateless`. Расширение Tasks в выпуске не реализовано.

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

Совместимость Dual-era работает с обеими эпохами и выбирает по собеседнику

- **Проверенная версия:** 1.8.0, выпуск от 2026-09-14

- **Новейшая поддерживаемая редакция:** 2026-07-28

- **С сервером только Modern:** работает

- **С сервером только Legacy:** работает

- **Переход на старую редакцию:** автоматически

- **Использует устаревшее:** Roots, Sampling, Logging, динамическая регистрация клиента (DCR), транспорт HTTP+SSE

- **Сохраняет удалённое в редакции 2026-07-28:** сессии, рукопожатие initialize

- **Расширение Tasks:** нет

- **Расширение MCP Apps:** неизвестно

- **Проверено:** 2026-10-04

- **Источник:** [github.com](https://github.com/modelcontextprotocol/go-sdk/releases/tag/v1.8.0)

## Что это

Это SDK из репозитория [modelcontextprotocol/go-sdk](https://github.com/modelcontextprotocol/go-sdk/tree/v1.8.0). [README выпуска](https://github.com/modelcontextprotocol/go-sdk/blob/v1.8.0/README.md) называет его реализацией официального Go SDK для MCP, а [список официальных SDK](https://modelcontextprotocol.io/docs/sdk) относит его к первому уровню (Tier 1).

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

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

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

## Установка и среда

В README выпуска команды установки нет. Она есть в [кратком руководстве](https://github.com/modelcontextprotocol/go-sdk/blob/v1.8.0/docs/quick_start.md):

```bash title="Установка"
go get github.com/modelcontextprotocol/go-sdk/mcp
```

В [`go.mod`](https://github.com/modelcontextprotocol/go-sdk/blob/v1.8.0/go.mod) выпуска записано `go 1.25.0`. По README, новые выпуски SDK рассчитаны только на поддерживаемые версии Go.

## Какие редакции понимает выпуск

Список версий в [`mcp/shared.go`](https://github.com/modelcontextprotocol/go-sdk/blob/v1.8.0/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 на стороне клиента имеет опытную поддержку.

Для вас это значит: по [документу о протоколе](https://github.com/modelcontextprotocol/go-sdk/blob/v1.8.0/docs/protocol.md), SDK поддерживает обе модели жизненного цикла и выбирает одну по согласованной версии, а программный интерфейс при этом один и тот же. Чем эпохи различаются, описано на странице [о версиях протокола](https://mcpdoc.ru/protocol/versions/).

## Что отправляет клиент по умолчанию

По документу о протоколе, `Client.Connect` сначала вызывает `server/discover` и по ответу выбирает общую версию. Если запрос не удался или сервер не поддерживает самую новую версию, клиент переходит на старое рукопожатие `initialize`. В [`mcp/client.go`](https://github.com/modelcontextprotocol/go-sdk/blob/v1.8.0/mcp/client.go) видно, что откат идёт с версией 2025-11-25.

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

```go title="Клиент"
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` в нём.

Документ о протоколе выпуска v1.8.0 говорит: транспорт Streamable HTTP принимает запросы редакции 2026-07-28 только при `StreamableHTTPOptions.Stateless = true`. Запросы этой редакции к обработчику без этой настройки отклоняются. В режиме `Stateless` сервер не читает и не выставляет `Mcp-Session-Id`, запросы `GET` и `DELETE` получают `405`, а запросы от сервера к клиенту невозможны.

```go title="Сервер на 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 и здесь не запускался.

Как совместить обе эпохи на одном адресе, разобрано на странице [о сервере двух эпох](https://mcpdoc.ru/deployment/dual-era/).

## Расширения

**Tasks.** В выпуске v1.8.0 расширение не реализовано. В [плане развития](https://github.com/modelcontextprotocol/go-sdk/blob/v1.8.0/ROADMAP.md) есть только пункт об опытной реализации задач по более раннему предложению SEP-1686. Строк `tasks/get`, `io.modelcontextprotocol/tasks` и `SEP-2663` в исходниках и документации выпуска нет.

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

Что такое расширения и как о них договариваются стороны - на странице [о расширениях](https://mcpdoc.ru/protocol/extensions/).

## Устаревшее, что выпуск ещё содержит

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

Общий список - на странице [об устаревших возможностях](https://mcpdoc.ru/protocol/deprecations/).

## Выпуск и ветка main

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

## Что неизвестно

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

README выпуска называет сторонние SDK для Go, например `mcp-go`, жизнеспособной альтернативой. Это отдельные проекты. Сведения этой страницы к ним не относятся.

## Что читать дальше

- [Все официальные SDK](https://mcpdoc.ru/sdk/)
- [Работа без сеансов](https://mcpdoc.ru/protocol/stateless/)
- [Запрос server/discover](https://mcpdoc.ru/protocol/discovery/)
- [Развёртывание в Docker](https://mcpdoc.ru/deployment/docker/)
