diff --git a/README.md b/README.md index 874274cb..29a9bd9b 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ If you want to build a local command-line application, you can use the stdio tra ```ruby #!/usr/bin/env ruby require "mcp" -require "mcp/server/transports/stdio" +require "mcp/server/transports/stdio_transport" # Create a simple tool class ExampleTool < MCP::Tool diff --git a/examples/stdio_server.rb b/examples/stdio_server.rb index cddf912e..19b28559 100755 --- a/examples/stdio_server.rb +++ b/examples/stdio_server.rb @@ -3,7 +3,7 @@ $LOAD_PATH.unshift(File.expand_path("../lib", __dir__)) require "mcp" -require "mcp/server/transports/stdio" +require "mcp/server/transports/stdio_transport" # Create a simple tool class ExampleTool < MCP::Tool diff --git a/lib/mcp.rb b/lib/mcp.rb index cb2c2f92..eff9de88 100644 --- a/lib/mcp.rb +++ b/lib/mcp.rb @@ -13,7 +13,7 @@ require_relative "mcp/resource/embedded" require_relative "mcp/resource_template" require_relative "mcp/server" -require_relative "mcp/server/transports/stdio" +require_relative "mcp/server/transports/stdio_transport" require_relative "mcp/string_utils" require_relative "mcp/tool" require_relative "mcp/tool/input_schema" diff --git a/lib/mcp/server/transports/stdio.rb b/lib/mcp/server/transports/stdio_transport.rb similarity index 100% rename from lib/mcp/server/transports/stdio.rb rename to lib/mcp/server/transports/stdio_transport.rb diff --git a/test/mcp/server/transports/stdio_test.rb b/test/mcp/server/transports/stdio_transport_test.rb similarity index 97% rename from test/mcp/server/transports/stdio_test.rb rename to test/mcp/server/transports/stdio_transport_test.rb index 57a16909..9dd2d55b 100644 --- a/test/mcp/server/transports/stdio_test.rb +++ b/test/mcp/server/transports/stdio_transport_test.rb @@ -1,13 +1,13 @@ # frozen_string_literal: true require "test_helper" -require "mcp/server/transports/stdio" +require "mcp/server/transports/stdio_transport" require "json" module MCP class Server module Transports - class StdioTest < ActiveSupport::TestCase + class StdioTransportTest < ActiveSupport::TestCase include InstrumentationTestHelper setup do diff --git a/test/mcp/transports/stdio_transport_test.rb b/test/mcp/transports/stdio_transport_test.rb deleted file mode 100644 index 2fe5df2a..00000000 --- a/test/mcp/transports/stdio_transport_test.rb +++ /dev/null @@ -1,125 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" -require "mcp/transports/stdio" -require "json" - -module MCP - module Transports - class StdioTransportTest < ActiveSupport::TestCase - include InstrumentationTestHelper - - setup do - configuration = MCP::Configuration.new - configuration.instrumentation_callback = instrumentation_helper.callback - @server = Server.new(name: "test_server", configuration: configuration) - @transport = StdioTransport.new(@server) - end - - test "initializes with server and closed state" do - server = @transport.instance_variable_get(:@server) - assert_equal @server.object_id, server.object_id - refute @transport.instance_variable_get(:@open) - end - - test "processes JSON-RPC requests from stdin and sends responses to stdout" do - request = { - jsonrpc: "2.0", - method: "ping", - id: "123", - } - input = StringIO.new(JSON.generate(request) + "\n") - output = StringIO.new - - original_stdin = $stdin - original_stdout = $stdout - - begin - $stdin = input - $stdout = output - - thread = Thread.new { @transport.open } - sleep(0.1) - @transport.close - thread.join - - response = JSON.parse(output.string, symbolize_names: true) - assert_equal("2.0", response[:jsonrpc]) - assert_equal("123", response[:id]) - assert_empty(response[:result]) - refute(@transport.instance_variable_get(:@open)) - ensure - $stdin = original_stdin - $stdout = original_stdout - end - end - - test "sends string responses to stdout" do - output = StringIO.new - original_stdout = $stdout - - begin - $stdout = output - @transport.send_response("test response") - assert_equal("test response\n", output.string) - ensure - $stdout = original_stdout - end - end - - test "sends JSON responses to stdout" do - output = StringIO.new - original_stdout = $stdout - - begin - $stdout = output - response = { key: "value" } - @transport.send_response(response) - assert_equal(JSON.generate(response) + "\n", output.string) - ensure - $stdout = original_stdout - end - end - - test "handles valid JSON-RPC requests" do - request = { - jsonrpc: "2.0", - method: "ping", - id: "123", - } - output = StringIO.new - original_stdout = $stdout - - begin - $stdout = output - @transport.send(:handle_request, JSON.generate(request)) - response = JSON.parse(output.string, symbolize_names: true) - assert_equal("2.0", response[:jsonrpc]) - assert_nil(response[:id]) - assert_nil(response[:result]) - ensure - $stdout = original_stdout - end - end - - test "handles invalid JSON requests" do - invalid_json = "invalid json" - output = StringIO.new - original_stdout = $stdout - - begin - $stdout = output - @transport.send(:handle_request, invalid_json) - response = JSON.parse(output.string, symbolize_names: true) - assert_equal("2.0", response[:jsonrpc]) - assert_nil(response[:id]) - assert_equal(-32600, response[:error][:code]) - assert_equal("Invalid Request", response[:error][:message]) - assert_equal("Request must be an array or a hash", response[:error][:data]) - ensure - $stdout = original_stdout - end - end - end - end -end