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

Ruby SDK

Официальный Ruby SDK для MCP, gem mcp 1.6.1 - какие редакции протокола он понимает, как клиент выбирает эпоху, что принимает сервер и что остаётся неизвестным

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

В README выпуска пакет назван так: «The official Ruby SDK for Model Context Protocol servers and clients». В нём есть и сервер, и клиент.

В списке официальных SDK у Ruby стоит первый уровень (Tier 1). Что означает уровень, описано в правилах уровней SDK: первый уровень - это полная реализация протокола и обязательства по сопровождению.

Кто сопровождает SDK, ни README, ни список официальных SDK не говорят.

Проверенный выпуск - 1.6.1 от 27 сентября 2026. Дата взята со страницы пакета на RubyGems и из выпуска на GitHub. Предварительных выпусков новее него нет.

Нужен Ruby 2.7.0 или новее - так записано в mcp.gemspec и в руководстве по установке.

Gemfile
gem "mcp"
Установка без Bundler
gem install mcp

Клиенту для HTTP нужен ещё gem faraday версии 2.0 или новее. Чтобы читать ответы в виде потока SSE, нужен event_stream_parser. Сервер сам решает, чем ответить: обычным JSON или потоком. Поэтому клиенту, который подключается к чужим серверам, руководство советует поставить оба пакета.

Список записан в lib/mcp/configuration.rb и повторён в документации о версиях.

Редакция Эпоха Как устанавливается связь
2026-07-28 Modern без рукопожатия, версия едет в каждом запросе
2025-11-25 Legacy рукопожатие initialize
2025-06-18 Legacy рукопожатие initialize
2025-03-26 Legacy рукопожатие initialize
2024-11-05 Legacy рукопожатие initialize

Для вас это значит следующее. Сервер, собранный на этом выпуске, обслуживает и клиента Modern, и клиента Legacy. Клиент, собранный на нём, подключится и к серверу только Modern, и к серверу только Legacy.

По журналу изменений редакция 2026-07-28 появилась в выпуске 1.1.0, а жизненный цикл без состояния был завершён в 1.2.0.

По описанию жизненного цикла клиента вызов MCP::Client#connect на встроенных транспортах MCP::Client::HTTP и MCP::Client::Stdio сначала отправляет server/discover. Если сервер отвечает как Modern, клиент работает по новому порядку. Если нет, клиент переходит на рукопожатие initialize.

Поведение можно задать явно:

Выбор жизненного цикла
client.connect # negotiate automatically (default)
client.connect(mode: :modern) # require the modern lifecycle; fails on legacy-only servers
client.connect(mode: :legacy) # force the classic initialize handshake
client.connect(protocol_version: "2025-11-25") # an explicit legacy version pins the handshake, no probe

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

Два замечания из той же документации:

  • Собственный транспорт, у которого connect не принимает параметр mode:, всегда получает старый порядок вызова.
  • Запросы от сервера к клиенту, которые принимают обработчики on_elicitation и on_sampling, существуют только в старом жизненном цикле. Для них документация советует mode: :legacy. В новой эпохе те же обработчики отвечают на вложенные запросы многошагового обмена: клиент выполняет их и повторяет исходный вызов.

По документации о версиях встроенные транспорты обслуживают обе эпохи одновременно, настройка для этого не нужна.

  • Запросы Modern сервер проверяет по одному: версия берётся из _meta каждого запроса.
  • В рукопожатии сервер по умолчанию предлагает 2025-11-25. Версию рукопожатия можно закрепить через MCP::Configuration.new(protocol_version:).
  • Рукопожатие никогда не договаривается о версии Modern. Клиенту, который просит в initialize версию 2026-07-28, сервер предложит последнюю версию рукопожатия.

Транспортов у сервера два: stdio и Streamable HTTP. Класс MCP::Server::Transports::StreamableHTTPTransport - обычное приложение Rack, его можно подключить в Rails. Подробности - в описании транспортов сервера.

Тот же транспорт по умолчанию проверяет заголовки Host и Origin и отклоняет чужие значения ответом 403. За обратным прокси списки разрешённых значений нужно расширить параметрами allowed_hosts: и allowed_origins:.

server.rb
require "mcp"
# Create a simple tool
class ExampleTool < MCP::Tool
description "A simple example tool that echoes back its arguments"
input_schema(
properties: {
message: { type: "string" },
},
required: ["message"]
)
class << self
def call(message:, server_context:)
MCP::Tool::Response.new([{
type: "text",
text: "Hello from example tool! Message: #{message}",
}])
end
end
end
# Set up the server
server = MCP::Server.new(
name: "example_server",
tools: [ExampleTool],
)
# Create and start the transport
transport = MCP::Server::Transports::StdioTransport.new(server)
transport.open

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

client.rb
stdio_transport = MCP::Client::Stdio.new(
command: "bundle",
args: ["exec", "ruby", "path/to/server.rb"],
env: { "API_KEY" => "my_secret_key" },
read_timeout: 30
)
client = MCP::Client.new(transport: stdio_transport)
# Negotiate the protocol lifecycle before sending any requests.
client.connect
# List available tools.
tools = client.tools
tools.each do |tool|
puts "Tool: #{tool.name} - #{tool.description}"
end
# Call a specific tool.
response = client.call_tool(
tool: tools.first,
arguments: { message: "Hello, world!" }
)
# Close the transport when done.
stdio_transport.close

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

Tasks. В выпуске не реализовано. В плане развития сказано, что расширение Tasks пока не реализовано и остаётся в планах.

MCP Apps. Есть помощники для стороны сервера - модуль MCP::Apps. По документации расширения он объявляет расширение io.modelcontextprotocol/ui, описывает ресурс с адресом ui:// и связывает инструмент с этим ресурсом. Показ интерфейса, изолированная рамка и согласие пользователя - задача программы-хоста, а не SDK. Поэтому в блоке совместимости стоит «частично».

Функция Как с ней обходится выпуск 1.6.1
Roots, Sampling, Logging Поддерживаются на всём протяжении линии 1.x. При подключении Modern клиент выдаёт предупреждение, если объявлены Roots или Sampling. Срок удаления не назначен
initialize и сеансы Работают в старой эпохе. Отказ от неё план развития оставляет на будущий мажорный выпуск
Динамическая регистрация клиента (RFC 7591) Клиент OAuth применяет её при необходимости. Документация авторизации называет её устаревшей с 2026-07-28 и предлагает Client ID Metadata Documents
HTTP+SSE из 2024-11-05 Не реализован намеренно: SDK даёт только Streamable HTTP

На 4 октября 2026 ветка main опережает метку v1.6.1 на 16 изменений. Файл lib/mcp/configuration.rb в ней совпадает с выпуском: список редакций тот же. Раздел «Unreleased» в журнале изменений на main пуст.

  • Кто сопровождает SDK: README и список официальных SDK этого не говорят.
  • Есть ли в SDK что-либо для показа MCP Apps на стороне хоста: документация выпуска описывает только сторону сервера.
  • Срок удаления Roots, Sampling и Logging из SDK: план развития прямо говорит, что он не назначен.