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 и в руководстве по установке.
gem "mcp"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 serversclient.connect(mode: :legacy) # force the classic initialize handshakeclient.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:.
Минимальный сервер
Заголовок раздела «Минимальный сервер»require "mcp"
# Create a simple toolclass 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 endend
# Set up the serverserver = MCP::Server.new( name: "example_server", tools: [ExampleTool],)
# Create and start the transporttransport = MCP::Server::Transports::StdioTransport.new(server)transport.openПример взят из документации выпуска 1.6.1 и здесь не запускался.
Минимальный клиент
Заголовок раздела «Минимальный клиент»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.toolstools.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 |
Выпуск и ветка main
Заголовок раздела «Выпуск и ветка main»На 4 октября 2026 ветка main опережает метку v1.6.1 на 16 изменений. Файл lib/mcp/configuration.rb в ней совпадает с выпуском: список редакций тот же. Раздел «Unreleased» в журнале изменений на main пуст.
Что неизвестно
Заголовок раздела «Что неизвестно»- Кто сопровождает SDK: README и список официальных SDK этого не говорят.
- Есть ли в SDK что-либо для показа MCP Apps на стороне хоста: документация выпуска описывает только сторону сервера.
- Срок удаления Roots, Sampling и Logging из SDK: план развития прямо говорит, что он не назначен.
Что читать дальше
Заголовок раздела «Что читать дальше»- Все SDK - сравнение официальных SDK по эпохам.
- Обнаружение: server/discover - запрос, с которого клиент начинает проверку эпохи.
- Две эпохи на одном сервере - как обслуживать старых и новых клиентов.
- Устаревшие функции - сроки для Roots, Sampling, Logging и HTTP+SSE.