diff --git a/.cursor/rules/release-changelogs.mdc b/.cursor/rules/release-changelogs.mdc index f7309a93..a5508dd7 100644 --- a/.cursor/rules/release-changelogs.mdc +++ b/.cursor/rules/release-changelogs.mdc @@ -1,23 +1,20 @@ --- description: writing changelog markdown when cutting a new release of the gem -globs: +globs: alwaysApply: false --- -- output the changelog as markdown when asked. +- output the changelog as markdown when asked. - git tags are used to mark the commit that cut a new release of the gem -- the gem version is located in [version.rb](mdc:lib/model_context_protocol/version.rb) +- the gem version is located in [version.rb](mdc:lib/mcp/version.rb) - use the git history, especially merge commits from PRs to construct the changelog -- when necessary, look at the diff of files changed to determine whether a PR should be listed in +- when necessary, look at the diff of files changed to determine whether a PR should be listed in - ## Added; adds new functionality - ## Changed; alters functionality; especially backward compatible changes - - ## Fixed; bugfixes that are forward compatible + - ## Fixed; bugfixes that are forward compatible use the following format for changelogs: -https://cloudsmith.io/~shopify/repos/gems/packages/detail/ruby/mcp-ruby/{gem version}/ - -# Changelog - +``` ## Added - New functionality added that was not present before @@ -25,8 +22,9 @@ https://cloudsmith.io/~shopify/repos/gems/packages/detail/ruby/mcp-ruby/{gem ver - Alterations to functionality that may indicate breaking changes ## Fixed -- Bug fixes +- Bug fixes #### Full change list: -- [Name of the PR #123](mdc:https:/github.com/Shopify/mcp-ruby/pull/123) @github-author-username -- [Name of the PR #456](mdc:https:/github.com/Shopify/mcp-ruby/pull/456) @another-github-author +- [Name of the PR #123](https:/github.com/modelcontextprotocol/ruby-sdk/pull/123) @github-author-username +- [Name of the PR #456](https:/github.com/modelcontextprotocol/ruby-sdk/pull/456) @another-github-author +``` diff --git a/README.md b/README.md index 00acd408..6c4c5279 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,29 @@ A Ruby gem for implementing Model Context Protocol servers +## Installation + +Add this line to your application's Gemfile: + +```ruby +gem 'mcp' +``` + +And then execute: + +```bash +$ bundle install +``` + +Or install it yourself as: + +```bash +$ gem install mcp +``` + ## MCP Server -The `ModelContextProtocol::Server` class is the core component that handles JSON-RPC requests and responses. +The `MCP::Server` class is the core component that handles JSON-RPC requests and responses. It implements the Model Context Protocol specification, handling model context requests and responses. ### Key Features @@ -44,19 +64,17 @@ requests. You can use the `Server#handle_json` method to handle requests. ```ruby -module ModelContextProtocol - class ApplicationController < ActionController::Base - - def index - server = ModelContextProtocol::Server.new( - name: "my_server", - version: "1.0.0", - tools: [SomeTool, AnotherTool], - prompts: [MyPrompt], - server_context: { user_id: current_user.id }, - ) - render(json: server.handle_json(request.body.read).to_h) - end +class ApplicationController < ActionController::Base + + def index + server = MCP::Server.new( + name: "my_server", + version: "1.0.0", + tools: [SomeTool, AnotherTool], + prompts: [MyPrompt], + server_context: { user_id: current_user.id }, + ) + render(json: server.handle_json(request.body.read)) end end ``` @@ -67,11 +85,11 @@ If you want to build a local command-line application, you can use the stdio tra ```ruby #!/usr/bin/env ruby -require "model_context_protocol" -require "model_context_protocol/transports/stdio" +require "mcp" +require "mcp/transports/stdio" # Create a simple tool -class ExampleTool < ModelContextProtocol::Tool +class ExampleTool < MCP::Tool description "A simple example tool that echoes back its arguments" input_schema( properties: { @@ -82,7 +100,7 @@ class ExampleTool < ModelContextProtocol::Tool class << self def call(message:, server_context:) - ModelContextProtocol::Tool::Response.new([{ + MCP::Tool::Response.new([{ type: "text", text: "Hello from example tool! Message: #{message}", }]) @@ -91,13 +109,13 @@ class ExampleTool < ModelContextProtocol::Tool end # Set up the server -server = ModelContextProtocol::Server.new( +server = MCP::Server.new( name: "example_server", tools: [ExampleTool], ) # Create and start the transport -transport = ModelContextProtocol::Transports::StdioTransport.new(server) +transport = MCP::Transports::StdioTransport.new(server) transport.open ``` @@ -112,10 +130,10 @@ $ ./stdio_server.rb ## Configuration -The gem can be configured using the `ModelContextProtocol.configure` block: +The gem can be configured using the `MCP.configure` block: ```ruby -ModelContextProtocol.configure do |config| +MCP.configure do |config| config.exception_reporter = ->(exception, server_context) { # Your exception reporting logic here # For example with Bugsnag: @@ -135,7 +153,7 @@ This is useful for systems where an application hosts more than one MCP server b they might require different instrumentation callbacks. ```ruby -configuration = ModelContextProtocol::Configuration.new +configuration = MCP::Configuration.new configuration.exception_reporter = ->(exception, server_context) { # Your exception reporting logic here # For example with Bugsnag: @@ -148,7 +166,7 @@ configuration.instrumentation_callback = ->(data) { puts "Got instrumentation data #{data.inspect}" } -server = ModelContextProtocol::Server.new( +server = MCP::Server.new( # ... all other options configuration:, ) @@ -167,7 +185,7 @@ server_context: { [String, Symbol] => Any } **Example:** ```ruby -server = ModelContextProtocol::Server.new( +server = MCP::Server.new( name: "my_server", server_context: { user_id: current_user.id, request_id: request.uuid } ) @@ -218,13 +236,13 @@ config.instrumentation_callback = ->(data) { The server's protocol version can be overridden using the `protocol_version` class method: ```ruby -ModelContextProtocol::Server.protocol_version = "2024-11-05" +MCP::Server.protocol_version = "2024-11-05" ``` This will make all new server instances use the specified protocol version instead of the default version. The protocol version can be reset to the default by setting it to `nil`: ```ruby -ModelContextProtocol::Server.protocol_version = nil +MCP::Server.protocol_version = nil ``` Be sure to check the [MCP spec](https://spec.modelcontextprotocol.io/specification/2024-11-05/) for the protocol version to understand the supported features for the version being set. @@ -253,12 +271,12 @@ If no exception reporter is configured, a default no-op reporter is used that si MCP spec includes [Tools](https://modelcontextprotocol.io/docs/concepts/tools) which provide functionality to LLM apps. -This gem provides a `ModelContextProtocol::Tool` class that can be used to create tools in two ways: +This gem provides a `MCP::Tool` class that can be used to create tools in two ways: 1. As a class definition: ```ruby -class MyTool < ModelContextProtocol::Tool +class MyTool < MCP::Tool description "This tool performs specific functionality..." input_schema( properties: { @@ -275,17 +293,17 @@ class MyTool < ModelContextProtocol::Tool ) def self.call(message:, server_context:) - Tool::Response.new([{ type: "text", text: "OK" }]) + MCP::Tool::Response.new([{ type: "text", text: "OK" }]) end end tool = MyTool ``` -2. By using the `ModelContextProtocol::Tool.define` method with a block: +2. By using the `MCP::Tool.define` method with a block: ```ruby -tool = ModelContextProtocol::Tool.define( +tool = MCP::Tool.define( name: "my_tool", description: "This tool performs specific functionality...", annotations: { @@ -316,12 +334,12 @@ Annotations can be set either through the class definition using the `annotation MCP spec includes [Prompts](https://modelcontextprotocol.io/docs/concepts/prompts), which enable servers to define reusable prompt templates and workflows that clients can easily surface to users and LLMs. -The `ModelContextProtocol::Prompt` class provides two ways to create prompts: +The `MCP::Prompt` class provides two ways to create prompts: 1. As a class definition with metadata: ```ruby -class MyPrompt < ModelContextProtocol::Prompt +class MyPrompt < MCP::Prompt prompt_name "my_prompt" # Optional - defaults to underscored class name description "This prompt performs specific functionality..." arguments [ @@ -354,10 +372,10 @@ end prompt = MyPrompt ``` -2. Using the `ModelContextProtocol::Prompt.define` method: +2. Using the `MCP::Prompt.define` method: ```ruby -prompt = ModelContextProtocol::Prompt.define( +prompt = MCP::Prompt.define( name: "my_prompt", description: "This prompt performs specific functionality...", arguments: [ @@ -399,7 +417,7 @@ e.g. around authentication state or user preferences. Register prompts with the MCP server: ```ruby -server = ModelContextProtocol::Server.new( +server = MCP::Server.new( name: "my_server", prompts: [MyPrompt], server_context: { user_id: current_user.id }, @@ -417,7 +435,7 @@ The server allows registering a callback to receive information about instrument To register a handler pass a proc/lambda to as `instrumentation_callback` into the server constructor. ```ruby -ModelContextProtocol.configure do |config| +MCP.configure do |config| config.instrumentation_callback = ->(data) { puts "Got instrumentation data #{data.inspect}" end @@ -439,16 +457,16 @@ This is to avoid potential issues with metric cardinality MCP spec includes [Resources](https://modelcontextprotocol.io/docs/concepts/resources) -The `ModelContextProtocol::Resource` class provides a way to register resources with the server. +The `MCP::Resource` class provides a way to register resources with the server. ```ruby -resource = ModelContextProtocol::Resource.new( +resource = MCP::Resource.new( uri: "example.com/my_resource", mime_type: "text/plain", text: "Lorem ipsum dolor sit amet" ) -server = ModelContextProtocol::Server.new( +server = MCP::Server.new( name: "my_server", resources: [resource], ) diff --git a/examples/stdio_server.rb b/examples/stdio_server.rb index 631822ed..177b3721 100755 --- a/examples/stdio_server.rb +++ b/examples/stdio_server.rb @@ -2,8 +2,8 @@ # frozen_string_literal: true $LOAD_PATH.unshift(File.expand_path("../lib", __dir__)) -require "model_context_protocol" -require "model_context_protocol/transports/stdio" +require "mcp" +require "mcp/transports/stdio" # Create a simple tool class ExampleTool < MCP::Tool diff --git a/lib/mcp-ruby.rb b/lib/mcp-ruby.rb deleted file mode 100644 index ef77ab61..00000000 --- a/lib/mcp-ruby.rb +++ /dev/null @@ -1,3 +0,0 @@ -# frozen_string_literal: true - -require_relative "model_context_protocol" diff --git a/lib/mcp.rb b/lib/mcp.rb new file mode 100644 index 00000000..7eb8870a --- /dev/null +++ b/lib/mcp.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +require_relative "mcp/server" +require_relative "mcp/string_utils" +require_relative "mcp/tool" +require_relative "mcp/tool/input_schema" +require_relative "mcp/tool/annotations" +require_relative "mcp/tool/response" +require_relative "mcp/content" +require_relative "mcp/resource" +require_relative "mcp/resource/contents" +require_relative "mcp/resource/embedded" +require_relative "mcp/resource_template" +require_relative "mcp/prompt" +require_relative "mcp/prompt/argument" +require_relative "mcp/prompt/message" +require_relative "mcp/prompt/result" +require_relative "mcp/version" +require_relative "mcp/configuration" +require_relative "mcp/methods" + +module MCP + class << self + def configure + yield(configuration) + end + + def configuration + @configuration ||= Configuration.new + end + end + + class Annotations + attr_reader :audience, :priority + + def initialize(audience: nil, priority: nil) + @audience = audience + @priority = priority + end + end +end diff --git a/lib/model_context_protocol/configuration.rb b/lib/mcp/configuration.rb similarity index 98% rename from lib/model_context_protocol/configuration.rb rename to lib/mcp/configuration.rb index b6dab82f..39eeebef 100644 --- a/lib/model_context_protocol/configuration.rb +++ b/lib/mcp/configuration.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module ModelContextProtocol +module MCP class Configuration DEFAULT_PROTOCOL_VERSION = "2024-11-05" diff --git a/lib/model_context_protocol/content.rb b/lib/mcp/content.rb similarity index 95% rename from lib/model_context_protocol/content.rb rename to lib/mcp/content.rb index 6a11e7a3..65fc11f5 100644 --- a/lib/model_context_protocol/content.rb +++ b/lib/mcp/content.rb @@ -1,7 +1,7 @@ # typed: true # frozen_string_literal: true -module ModelContextProtocol +module MCP module Content class Text attr_reader :text, :annotations diff --git a/lib/model_context_protocol/instrumentation.rb b/lib/mcp/instrumentation.rb similarity index 95% rename from lib/model_context_protocol/instrumentation.rb rename to lib/mcp/instrumentation.rb index 73d1209a..5632fdda 100644 --- a/lib/model_context_protocol/instrumentation.rb +++ b/lib/mcp/instrumentation.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module ModelContextProtocol +module MCP module Instrumentation def instrument_call(method, &block) start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) diff --git a/lib/model_context_protocol/methods.rb b/lib/mcp/methods.rb similarity index 98% rename from lib/model_context_protocol/methods.rb rename to lib/mcp/methods.rb index 02ac4b7f..4f0b0b2a 100644 --- a/lib/model_context_protocol/methods.rb +++ b/lib/mcp/methods.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module ModelContextProtocol +module MCP module Methods INITIALIZE = "initialize" PING = "ping" diff --git a/lib/model_context_protocol/prompt.rb b/lib/mcp/prompt.rb similarity index 95% rename from lib/model_context_protocol/prompt.rb rename to lib/mcp/prompt.rb index d7cd4b97..7624ef55 100644 --- a/lib/model_context_protocol/prompt.rb +++ b/lib/mcp/prompt.rb @@ -1,7 +1,7 @@ # typed: strict # frozen_string_literal: true -module ModelContextProtocol +module MCP class Prompt class << self NOT_SET = Object.new @@ -67,7 +67,7 @@ def validate_arguments!(args) missing = required_args - args.keys return if missing.empty? - raise ModelContextProtocol::Server::RequestHandlerError.new( + raise MCP::Server::RequestHandlerError.new( "Missing required arguments: #{missing.join(", ")}", nil, error_type: :missing_required_arguments ) end diff --git a/lib/model_context_protocol/prompt/argument.rb b/lib/mcp/prompt/argument.rb similarity index 93% rename from lib/model_context_protocol/prompt/argument.rb rename to lib/mcp/prompt/argument.rb index 99402845..2a22fd4a 100644 --- a/lib/model_context_protocol/prompt/argument.rb +++ b/lib/mcp/prompt/argument.rb @@ -1,7 +1,7 @@ # typed: strict # frozen_string_literal: true -module ModelContextProtocol +module MCP class Prompt class Argument attr_reader :name, :description, :required, :arguments diff --git a/lib/model_context_protocol/prompt/message.rb b/lib/mcp/prompt/message.rb similarity index 91% rename from lib/model_context_protocol/prompt/message.rb rename to lib/mcp/prompt/message.rb index e7bf602c..b5c94f9a 100644 --- a/lib/model_context_protocol/prompt/message.rb +++ b/lib/mcp/prompt/message.rb @@ -1,7 +1,7 @@ # typed: strict # frozen_string_literal: true -module ModelContextProtocol +module MCP class Prompt class Message attr_reader :role, :content diff --git a/lib/model_context_protocol/prompt/result.rb b/lib/mcp/prompt/result.rb similarity index 92% rename from lib/model_context_protocol/prompt/result.rb rename to lib/mcp/prompt/result.rb index 685bbc85..693885f7 100644 --- a/lib/model_context_protocol/prompt/result.rb +++ b/lib/mcp/prompt/result.rb @@ -1,7 +1,7 @@ # typed: strict # frozen_string_literal: true -module ModelContextProtocol +module MCP class Prompt class Result attr_reader :description, :messages diff --git a/lib/model_context_protocol/resource.rb b/lib/mcp/resource.rb similarity index 93% rename from lib/model_context_protocol/resource.rb rename to lib/mcp/resource.rb index 800834f6..5b985a93 100644 --- a/lib/model_context_protocol/resource.rb +++ b/lib/mcp/resource.rb @@ -1,7 +1,7 @@ # typed: strict # frozen_string_literal: true -module ModelContextProtocol +module MCP class Resource attr_reader :uri, :name, :description, :mime_type diff --git a/lib/model_context_protocol/resource/contents.rb b/lib/mcp/resource/contents.rb similarity index 96% rename from lib/model_context_protocol/resource/contents.rb rename to lib/mcp/resource/contents.rb index 34282f3c..0bebb396 100644 --- a/lib/model_context_protocol/resource/contents.rb +++ b/lib/mcp/resource/contents.rb @@ -1,7 +1,7 @@ # typed: strict # frozen_string_literal: true -module ModelContextProtocol +module MCP class Resource class Contents attr_reader :uri, :mime_type diff --git a/lib/model_context_protocol/resource/embedded.rb b/lib/mcp/resource/embedded.rb similarity index 92% rename from lib/model_context_protocol/resource/embedded.rb rename to lib/mcp/resource/embedded.rb index 9449d8ba..4cc9132b 100644 --- a/lib/model_context_protocol/resource/embedded.rb +++ b/lib/mcp/resource/embedded.rb @@ -1,7 +1,7 @@ # typed: strict # frozen_string_literal: true -module ModelContextProtocol +module MCP class Resource class Embedded attr_reader :resource, :annotations diff --git a/lib/model_context_protocol/resource_template.rb b/lib/mcp/resource_template.rb similarity index 94% rename from lib/model_context_protocol/resource_template.rb rename to lib/mcp/resource_template.rb index f82242af..e2cc6f2e 100644 --- a/lib/model_context_protocol/resource_template.rb +++ b/lib/mcp/resource_template.rb @@ -1,7 +1,7 @@ # typed: strict # frozen_string_literal: true -module ModelContextProtocol +module MCP class ResourceTemplate attr_reader :uri_template, :name, :description, :mime_type diff --git a/lib/model_context_protocol/server.rb b/lib/mcp/server.rb similarity index 98% rename from lib/model_context_protocol/server.rb rename to lib/mcp/server.rb index 0bde655e..6dde6156 100644 --- a/lib/model_context_protocol/server.rb +++ b/lib/mcp/server.rb @@ -4,7 +4,7 @@ require_relative "instrumentation" require_relative "methods" -module ModelContextProtocol +module MCP class Server DEFAULT_VERSION = "0.1.0" @@ -44,7 +44,7 @@ def initialize( @resource_templates = resource_templates @resource_index = index_resources_by_uri(resources) @server_context = server_context - @configuration = ModelContextProtocol.configuration.merge(configuration) + @configuration = MCP.configuration.merge(configuration) @handlers = { Methods::RESOURCES_LIST => method(:list_resources), diff --git a/lib/model_context_protocol/string_utils.rb b/lib/mcp/string_utils.rb similarity index 94% rename from lib/model_context_protocol/string_utils.rb rename to lib/mcp/string_utils.rb index 08bd5a80..3f0dcdb9 100644 --- a/lib/model_context_protocol/string_utils.rb +++ b/lib/mcp/string_utils.rb @@ -1,7 +1,7 @@ # typed: strict # frozen_string_literal: true -module ModelContextProtocol +module MCP module StringUtils extend self diff --git a/lib/model_context_protocol/tool.rb b/lib/mcp/tool.rb similarity index 98% rename from lib/model_context_protocol/tool.rb rename to lib/mcp/tool.rb index 388cf887..48378e43 100644 --- a/lib/model_context_protocol/tool.rb +++ b/lib/mcp/tool.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module ModelContextProtocol +module MCP class Tool class << self NOT_SET = Object.new diff --git a/lib/model_context_protocol/tool/annotations.rb b/lib/mcp/tool/annotations.rb similarity index 96% rename from lib/model_context_protocol/tool/annotations.rb rename to lib/mcp/tool/annotations.rb index 2266c9f0..6344334d 100644 --- a/lib/model_context_protocol/tool/annotations.rb +++ b/lib/mcp/tool/annotations.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module ModelContextProtocol +module MCP class Tool class Annotations attr_reader :title, :read_only_hint, :destructive_hint, :idempotent_hint, :open_world_hint diff --git a/lib/model_context_protocol/tool/input_schema.rb b/lib/mcp/tool/input_schema.rb similarity index 95% rename from lib/model_context_protocol/tool/input_schema.rb rename to lib/mcp/tool/input_schema.rb index 4718205e..4683b7e4 100644 --- a/lib/model_context_protocol/tool/input_schema.rb +++ b/lib/mcp/tool/input_schema.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module ModelContextProtocol +module MCP class Tool class InputSchema attr_reader :properties, :required diff --git a/lib/model_context_protocol/tool/response.rb b/lib/mcp/tool/response.rb similarity index 91% rename from lib/model_context_protocol/tool/response.rb rename to lib/mcp/tool/response.rb index 92077938..abf6ff48 100644 --- a/lib/model_context_protocol/tool/response.rb +++ b/lib/mcp/tool/response.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module ModelContextProtocol +module MCP class Tool class Response attr_reader :content, :is_error diff --git a/lib/model_context_protocol/transport.rb b/lib/mcp/transport.rb similarity index 96% rename from lib/model_context_protocol/transport.rb rename to lib/mcp/transport.rb index fc6aca53..7e4b63e1 100644 --- a/lib/model_context_protocol/transport.rb +++ b/lib/mcp/transport.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module ModelContextProtocol +module MCP class Transport def initialize(server) @server = server diff --git a/lib/model_context_protocol/transports/stdio.rb b/lib/mcp/transports/stdio.rb similarity index 96% rename from lib/model_context_protocol/transports/stdio.rb rename to lib/mcp/transports/stdio.rb index f72508b4..b76b9619 100644 --- a/lib/model_context_protocol/transports/stdio.rb +++ b/lib/mcp/transports/stdio.rb @@ -3,7 +3,7 @@ require_relative "../transport" require "json" -module ModelContextProtocol +module MCP module Transports class StdioTransport < Transport def initialize(server) diff --git a/lib/model_context_protocol/version.rb b/lib/mcp/version.rb similarity index 66% rename from lib/model_context_protocol/version.rb rename to lib/mcp/version.rb index c2e23239..1297fbf9 100644 --- a/lib/model_context_protocol/version.rb +++ b/lib/mcp/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true -module ModelContextProtocol +module MCP VERSION = "0.7.0" end diff --git a/lib/model_context_protocol.rb b/lib/model_context_protocol.rb deleted file mode 100644 index 02a7e98f..00000000 --- a/lib/model_context_protocol.rb +++ /dev/null @@ -1,43 +0,0 @@ -# typed: strict -# frozen_string_literal: true - -require_relative "model_context_protocol/server" -require_relative "model_context_protocol/string_utils" -require_relative "model_context_protocol/tool" -require_relative "model_context_protocol/tool/input_schema" -require_relative "model_context_protocol/tool/annotations" -require_relative "model_context_protocol/tool/response" -require_relative "model_context_protocol/content" -require_relative "model_context_protocol/resource" -require_relative "model_context_protocol/resource/contents" -require_relative "model_context_protocol/resource/embedded" -require_relative "model_context_protocol/resource_template" -require_relative "model_context_protocol/prompt" -require_relative "model_context_protocol/prompt/argument" -require_relative "model_context_protocol/prompt/message" -require_relative "model_context_protocol/prompt/result" -require_relative "model_context_protocol/version" -require_relative "model_context_protocol/configuration" - -module ModelContextProtocol - class << self - def configure - yield(configuration) - end - - def configuration - @configuration ||= Configuration.new - end - end - - class Annotations - attr_reader :audience, :priority - - def initialize(audience: nil, priority: nil) - @audience = audience - @priority = priority - end - end -end - -MCP = ModelContextProtocol diff --git a/model_context_protocol.gemspec b/mcp.gemspec similarity index 87% rename from model_context_protocol.gemspec rename to mcp.gemspec index 44ee5c33..c598f459 100644 --- a/model_context_protocol.gemspec +++ b/mcp.gemspec @@ -1,10 +1,10 @@ # frozen_string_literal: true -require_relative "lib/model_context_protocol/version" +require_relative "lib/mcp/version" Gem::Specification.new do |spec| - spec.name = "model_context_protocol" - spec.version = ModelContextProtocol::VERSION + spec.name = "mcp" + spec.version = MCP::VERSION spec.authors = ["Model Context Protocol"] spec.email = ["mcp-support@anthropic.com"] diff --git a/test/model_context_protocol/configuration_test.rb b/test/model_context_protocol/configuration_test.rb index e71efd44..71a1c278 100644 --- a/test/model_context_protocol/configuration_test.rb +++ b/test/model_context_protocol/configuration_test.rb @@ -2,7 +2,7 @@ require "test_helper" -module ModelContextProtocol +module MCP class ConfigurationTest < ActiveSupport::TestCase test "initializes with a default no-op exception reporter" do config = Configuration.new diff --git a/test/model_context_protocol/instrumentation_test.rb b/test/model_context_protocol/instrumentation_test.rb index 7a4f9337..e1ecf519 100644 --- a/test/model_context_protocol/instrumentation_test.rb +++ b/test/model_context_protocol/instrumentation_test.rb @@ -2,14 +2,14 @@ require "test_helper" -module ModelContextProtocol +module MCP class InstrumentationTest < ActiveSupport::TestCase class Subject include Instrumentation attr_reader :instrumentation_data_received, :configuration def initialize - @configuration = ModelContextProtocol::Configuration.new + @configuration = MCP::Configuration.new @configuration.instrumentation_callback = ->(data) { @instrumentation_data_received = data } end diff --git a/test/model_context_protocol/methods_test.rb b/test/model_context_protocol/methods_test.rb index f35b3b77..28e3f050 100644 --- a/test/model_context_protocol/methods_test.rb +++ b/test/model_context_protocol/methods_test.rb @@ -3,7 +3,7 @@ require "test_helper" -module ModelContextProtocol +module MCP class MethodsTest < ActiveSupport::TestCase test "ensure_capability! for tools/list method raises an error if tools capability is not present" do error = assert_raises(Methods::MissingRequiredCapabilityError) do diff --git a/test/model_context_protocol/prompt_test.rb b/test/model_context_protocol/prompt_test.rb index 151875cf..b93395fd 100644 --- a/test/model_context_protocol/prompt_test.rb +++ b/test/model_context_protocol/prompt_test.rb @@ -3,7 +3,7 @@ require "test_helper" -module ModelContextProtocol +module MCP class PromptTest < ActiveSupport::TestCase class TestPrompt < Prompt description "Test prompt" diff --git a/test/model_context_protocol/server_test.rb b/test/model_context_protocol/server_test.rb index fec44fa5..01b76228 100644 --- a/test/model_context_protocol/server_test.rb +++ b/test/model_context_protocol/server_test.rb @@ -5,7 +5,7 @@ require "json" require "debug" -module ModelContextProtocol +module MCP class ServerTest < ActiveSupport::TestCase include InstrumentationTestHelper setup do @@ -47,7 +47,7 @@ class ServerTest < ActiveSupport::TestCase ) @server_name = "test_server" - configuration = ModelContextProtocol::Configuration.new + configuration = MCP::Configuration.new configuration.instrumentation_callback = instrumentation_helper.callback @server = Server.new( @@ -61,7 +61,7 @@ class ServerTest < ActiveSupport::TestCase ) end - # https://spec.modelcontextprotocol.io/specification/2025-03-26/basic/utilities/ping/#behavior-requirements + # https://spec.MCP.io/specification/2025-03-26/basic/utilities/ping/#behavior-requirements test "#handle ping request returns empty response" do request = { jsonrpc: "2.0", @@ -655,14 +655,14 @@ def call(message:, server_context: nil) test "the global configuration is used if no configuration is passed to the server" do server = Server.new(name: "test_server") - assert_equal ModelContextProtocol.configuration.instrumentation_callback, + assert_equal MCP.configuration.instrumentation_callback, server.configuration.instrumentation_callback - assert_equal ModelContextProtocol.configuration.exception_reporter, + assert_equal MCP.configuration.exception_reporter, server.configuration.exception_reporter end test "the server configuration takes precedence over the global configuration" do - configuration = ModelContextProtocol::Configuration.new + configuration = MCP::Configuration.new local_callback = ->(data) { puts "Local callback #{data.inspect}" } local_exception_reporter = ->(exception, server_context) { puts "Local exception reporter #{exception.inspect} #{server_context.inspect}" diff --git a/test/model_context_protocol/string_utils_test.rb b/test/model_context_protocol/string_utils_test.rb index b43d1ee0..6613e891 100644 --- a/test/model_context_protocol/string_utils_test.rb +++ b/test/model_context_protocol/string_utils_test.rb @@ -2,7 +2,7 @@ require "test_helper" -module ModelContextProtocol +module MCP class StringUtilsTest < Minitest::Test def test_handle_from_class_name_returns_the_class_name_without_the_module_for_a_class_without_a_module assert_equal("test", StringUtils.handle_from_class_name("Test")) diff --git a/test/model_context_protocol/tool/input_schema_test.rb b/test/model_context_protocol/tool/input_schema_test.rb index c28bbcf2..1ded7afe 100644 --- a/test/model_context_protocol/tool/input_schema_test.rb +++ b/test/model_context_protocol/tool/input_schema_test.rb @@ -2,7 +2,7 @@ require "test_helper" -module ModelContextProtocol +module MCP class Tool class InputSchemaTest < ActiveSupport::TestCase test "required arguments are converted to symbols" do diff --git a/test/model_context_protocol/tool_test.rb b/test/model_context_protocol/tool_test.rb index 1b96022a..f53352b1 100644 --- a/test/model_context_protocol/tool_test.rb +++ b/test/model_context_protocol/tool_test.rb @@ -3,7 +3,7 @@ require "test_helper" -module ModelContextProtocol +module MCP class ToolTest < ActiveSupport::TestCase class TestTool < Tool tool_name "test_tool" diff --git a/test/model_context_protocol/transports/stdio_transport_test.rb b/test/model_context_protocol/transports/stdio_transport_test.rb index 498b0ffa..42c76cfe 100644 --- a/test/model_context_protocol/transports/stdio_transport_test.rb +++ b/test/model_context_protocol/transports/stdio_transport_test.rb @@ -1,16 +1,16 @@ # frozen_string_literal: true require "test_helper" -require "model_context_protocol/transports/stdio" +require "mcp/transports/stdio" require "json" -module ModelContextProtocol +module MCP module Transports class StdioTransportTest < ActiveSupport::TestCase include InstrumentationTestHelper setup do - configuration = ModelContextProtocol::Configuration.new + configuration = MCP::Configuration.new configuration.instrumentation_callback = instrumentation_helper.callback @server = Server.new(name: "test_server", configuration: configuration) @transport = StdioTransport.new(@server) diff --git a/test/test_helper.rb b/test/test_helper.rb index 0ba90133..99f6bbab 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -3,7 +3,7 @@ ENV["RAILS_ENV"] ||= "test" require "bundler/setup" -require "model_context_protocol" +require "mcp" require "minitest/autorun" require "minitest/reporters"