Skip to content

Releases: patvice/ruby_llm-mcp

v1.0.0 🎉

23 Feb 19:51
c0e570c

Choose a tag to compare

RubyLLM::MCP v1.0.0 🎉 (from v0.8.0)

v1.0.0 is a major milestone for RubyLLM::MCP. This release moves the project from rapid foundation work to a much more stable, protocol-aligned, production-ready baseline. This includes stability in the APIs we will offer going forward.

We support all the foundational components needs to offer a great MCP experience, from tools to auth and everything in between. Making it easy as possible for Rubiest to offer different connectivity options to their applications and/or agents! 🥳

What changed since v0.8

  • MCP ecosystem support expanded: Moved to an adapter pattern to be able to offer the official MCP gem as a protocol backend
  • Native MCP Adatper: pushs ahead, support for MCP 2025-11-25 updates including tasks and schema changes.
  • MCP Extensions and MCP Apps: Support for the newest MCP protcol draft comes with it Extension support. Including an implementation of MCP Apps. Which we have an app example for in the projects /examples folder.
  • OAuth is much more robust: fixes for Rails linking, challenge handling with automatic retry, browser cleanup, RFC 6749 token error alignment, protected-resource discovery fixes (including GitHub Copilot MCP), legacy path-based discovery fallback, normalized bearer token headers, and JRuby race-condition fixes in OAuth/auth storage flows.
  • Transports and lifecycle handling were hardened: improved transport reliability, better termination/status alignment, disabled repeated SSE fallback on 405, handled 201 in StreamableHTTP, and fixed inline SSE POST timeout behavior (Notion case).
  • Protocol and client behavior matured: RPC message refactor, JSON-RPC error code alignment, full cancellation notification support, correct stop-response handling, and a cleaner client response-handler interaction pattern.
  • Support for JRuby: While we didn't explicit not support JRuby in the past, we have added into our CI to catch any future regressions.
  • Docs and DX received a major refresh: rewritten README/docs index, updated examples and issue templates, plus branding updates for dark mode and new doc accent styling.

What's Next

This project is committed to bringing MCP feature setup to Ruby and as up to date as possible against the MCP protocol. We also want to offer great experiences and will seamlessly fit into the RubyLLM DSL. Developer will continue as the protocol expands but our foundation is set.

Thanks

Special thanks to new contributors @trevorturk and @plehoux for important fixes included in this release. On top of that I would like to everyone everyone else that has open an issue and/or created a pull request to get us to this point! 💪

v0.8.0

11 Nov 15:00
9bb0d93

Choose a tag to compare

RubyLLM::MCP v0.8 - OAuth 2.1 Support!!

Version 0.8.0 adds comprehensive OAuth 2.1 support for secure authentication with MCP servers.

OAuth 2.1 Authentication

This release implements OAuth 2.1 compliance with the security features you'd expect in production:

Key Features

  • Spec Compliant: Full implementation for OAuth 2.1 support as outlined MCP Spec
  • PKCE (RFC 7636): Proof Key for Code Exchange with SHA256 for secure authorization flows
  • Dynamic Client Registration (RFC 7591): Automatic client registration with OAuth servers
  • Server Discovery (RFC 8414): Automatic authorization server metadata discovery
  • Browser-Based Authentication: Built-in local callback server with a clean UI (pure Ruby, no external dependencies)
  • Automatic Token Refresh: Proactive token refresh with configurable buffers
  • Pluggable Storage: Flexible storage interface for tokens, client info, and metadata
  • Custom Storage: Implement your own storage backend for Redis, databases, or any persistence layer
  • Multi-Transport Support: Works with SSE and StreamableHTTP transports, including generator example in rails

Quick Example

require "ruby_llm/mcp"

# Create client with OAuth config
client = RubyLLM::MCP.client(
  name: "protected-server",
  transport_type: :sse,
  start: false,
  config: {
    url: "https://mcp.example.com/api",
    oauth: { scope: "mcp:read mcp:write" }
  }
)

# Authenticate via browser - that's it!
client.oauth(type: :browser).authenticate

# Use client normally
client.start
tools = client.tools

Documentation

For complete details, configuration options, and integration guides:

Installation

Update your Gemfile:

gem 'ruby_llm-mcp', '~> 0.8.0'

Then run:

bundle update ruby_llm-mcp

Acknowledgments

Big shoutout for @parruda for provided the initial implementation, and ideas on how this could be implementation and used effectively!

What's Changed

  • Fixed Gem Release Warnings by @patvice in #87
  • Add OAuth 2.1 support for MCP servers by @parruda in #88
  • OAuth Improvements: Refactor, Full MCP OAuth Spec Compliances and OAuth generator improvements by @patvice in #91
  • Version bump to 0.8 by @patvice in #92

Full Changelog: v0.7.1...v0.8.0

v0.7.1

06 Nov 17:56
0f0b769

Choose a tag to compare

What's Changed

  • Fix STDIO transport stream closure errors during graceful shutdown by @parruda in #85
  • Bump version to 0.7.1 by @patvice in #86

New Contributors

Full Changelog: v0.7.0...v0.7.1

v0.7.0

04 Nov 02:42
b264843

Choose a tag to compare

v0.7 - Support for RubyLLM v1.9

  • Full support for RubyLLM v1.9
  • Removes the need for support_complex_parameters!. Starting with this release, all future versions of RubyLLM::MCP will include full MCP tool capabilities out of the box.

What's Changed

Full Changelog: v0.6.4...v0.7.0

V0.6.4

01 Nov 16:25
cb53555

Choose a tag to compare

What's Changed

  • Fix intermittent CI failures due to missing Bun dependencies by @patvice in #80
  • Support both base and MCP Parameters in ComplexParameterSupport via Delegation by @patvice in #82

Full Changelog: v0.6.3...v0.6.4

v0.6.3 Release

28 Oct 19:17
57d7a69

Choose a tag to compare

What's Changed

Full Changelog: v0.6.2...v0.6.3

v0.6.2 Release

25 Oct 00:45
d61adeb

Choose a tag to compare

What's Changed

  • Fixed client usage and improved generator install message by @patvice in #63
  • Ensure SSE Transport handles multiple events with one raw stream by @patvice in #64
  • Fix complex anyOf parameter parsing with shorthand array types by @ericproulx in #71
  • MCP Ruby SDK fix by @patvice in #72
  • Support both Unix and Windows line separators for SSE streams by @patvice in #73
  • Added id in request to the notification/initialize MCP call by @patvice in #74
  • Fix missing type field handling and add title support for parameters by @patvice in #75
  • Bumped version to 0.6.2 by @patvice in #76

New Contributors

Full Changelog: v0.6.1...v0.6.2

V0.6.1

14 Jul 23:52
4e82580

Choose a tag to compare

V0.6.1

What's Changed

Full Changelog: v0.6.0...v0.6.1

V0.6.0

14 Jul 15:31
a545036

Choose a tag to compare

V0.6: Full support for MCP spec 2025-06-18, Global Callbacks, a new Doc Site and more

Full 2025-06-18 Support

This is the newest version of the MCP spec, which includes some iterations on core server objects and a new client interaction, Elicitation.

Major Changes

  • Add support for structured tool output
  • Build an OAuth story (use HTTPX OAuth functionality + config options and specs)
  • Verify we are doing the new security best practices.
  • Elicitation support, client features enabling servers to request additional information from users during interactions
  • Add support for resource links in tool call results
  • Require negotiated protocol version to be specified via MCP-Protocol-Version header in subsequent requests when using HTTP.

Other schema changes

  • Add _meta field to additional interface types, and specify proper usage.
  • Add context field to CompletionRequest, providing for completion requests to include previously-resolved variables.
  • Add title field for human-friendly display names, so that name can be used as a programmatic identifier

New Doc Site

This release we have created a full doc site to outline how to use the Gem and all the features that are packed inside it. We outgrew our readme.md last version and so now we have a way to give more examples, how to get started and content on specific areas.

Check it out at [https:://ruby](https://www.rubyllm-mcp.com/)

Global Callback configuration

In some cases you may want to use able to configure standard callbacks for MCPs across the services you connect to (for example maybe you have one shared human in the loop call). Now, instead defining all calls client by client, it can be done once at the RubyLLM::MCP::Configuration level.

 # Event handlers, these will be used for all clients, unless overridden on the client level
  config.on_progress do |progress|
    puts "Progress: #{progress}"
  end
  config.on_human_in_the_loop do |human_in_the_loop|
    puts "Human in the loop: #{human_in_the_loop}"
  end
  config.on_logging do |level, message|
    puts "Logging: #{level} - #{message}"
  end

For more information you can read about configuration here: https://www.rubyllm-mcp.com/configuration

Minor Improvements

  • RubyLLM::MCP#clients acts as a getter now. Meaning that it will always return all configured clients. We still keep the behaviour creating all configured MCP (from a file config or directly from the Configuration class), however, add and remove methods will also maintain the same state.
  • Some inconstancy was happening with SSE and http2 in some environments. We now support the available to force http1 if you are experiencing issues with http2. It's still recommend to keep http2 at the default.
  • Some improvements to SSE transport where also released. This was to match some behaviours of different server implementations and make sure we can support there behaviour (in this case it was the Typescript MCP SSE implementation).

Detailed Changes

Full Changelog: v0.5.1...v0.6.0

V0.5.1

07 Jul 21:37
65f0248

Choose a tag to compare

Bug fix and Improved MCP Interface Connection

MCP Interface

RubyLLM::MCP#establish_connection will not optionally take a block. If you want to use the clients outside of the block, you can use the clients method to get the clients.

clients = RubyLLM::MCP.establish_connection
chat = RubyLLM.chat(model: "gpt-4")
chat.with_tools(*clients.tools)

response = chat.ask("Hello, world!")
puts response

Then you are responsible for closing the MCP connections when you are done. We also added a connivence method RubyLLM::MCP#close_connection to do that on your behalf.

RubyLLM::MCP.close_connection

Bug Fix

  • Generator fold was not included in the gem build. This was fixed in v0.5.1

What's Changed

  • Improved MCP Connection Interface by @patvice in #43
  • Bug: Include Generator file in MCP gem by @patvice in #42

Full Changelog: v0.5.0...v0.5.1