Skip to content

Commit 15979cb

Browse files
committed
Auto-set server.transport in Transport#initialize
## Motivation and Context Transport subclasses (StreamableHTTPTransport, StdioTransport) already receive the server in their constructor, but users must manually call `server.transport = transport` after creating a transport instance. This is boilerplate that can be eliminated by setting the connection automatically in `Transport#initialize`. ## How Has This Been Tested? All existing tests pass. Redundant `server.transport = transport` lines were removed from tests, examples, README.md, and conformance server. ## Breaking Changes None. Existing code that manually sets `server.transport = transport` continues to work (idempotent assignment).
1 parent 2a1c9b7 commit 15979cb

12 files changed

+7
-37
lines changed

README.md

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ class McpController < ActionController::Base
125125
server_context: { user_id: current_user.id },
126126
)
127127
transport = MCP::Server::Transports::StreamableHTTPTransport.new(server)
128-
server.transport = transport
129128
status, headers, body = transport.handle_request(request)
130129

131130
render(json: body.first, status: status, headers: headers)
@@ -824,7 +823,6 @@ which routes the request to the correct client session.
824823
```ruby
825824
server = MCP::Server.new(name: "my_server")
826825
transport = MCP::Server::Transports::StdioTransport.new(server)
827-
server.transport = transport
828826
```
829827

830828
Client must declare sampling capability during initialization.
@@ -1122,7 +1120,6 @@ For more details, see the [MCP Logging specification](https://modelcontextprotoc
11221120
```ruby
11231121
server = MCP::Server.new(name: "my_server")
11241122
transport = MCP::Server::Transports::StdioTransport.new(server)
1125-
server.transport = transport
11261123

11271124
# The client first configures the logging level (on the client side):
11281125
transport.send_request(
@@ -1176,8 +1173,6 @@ server = MCP::Server.new(name: "my_server")
11761173
# Default Streamable HTTP - session oriented
11771174
transport = MCP::Server::Transports::StreamableHTTPTransport.new(server)
11781175

1179-
server.transport = transport
1180-
11811176
# When tools change, notify clients
11821177
server.define_tool(name: "new_tool") { |**args| { result: "ok" } }
11831178
server.notify_tools_list_changed

conformance/server.rb

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ def initialize(port: DEFAULT_PORT)
394394

395395
def start
396396
server = build_server
397-
transport = build_transport(server)
397+
transport = MCP::Server::Transports::StreamableHTTPTransport.new(server)
398398
configure_handlers(server)
399399
rack_app = build_rack_app(transport)
400400

@@ -480,12 +480,6 @@ def resource_templates
480480
]
481481
end
482482

483-
def build_transport(server)
484-
transport = MCP::Server::Transports::StreamableHTTPTransport.new(server)
485-
server.transport = transport
486-
transport
487-
end
488-
489483
def configure_handlers(server)
490484
server.logging_message_notification = MCP::LoggingMessageNotification.new(level: "debug")
491485
server.server_context = server

examples/http_server.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@ def template(args, server_context:)
9494

9595
# Create the Streamable HTTP transport
9696
transport = MCP::Server::Transports::StreamableHTTPTransport.new(server)
97-
server.transport = transport
9897

9998
# Create a logger for MCP-specific logging
10099
mcp_logger = Logger.new($stdout)

examples/streamable_http_server.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ def call(message:, delay: 0)
6363

6464
# Create the Streamable HTTP transport
6565
transport = MCP::Server::Transports::StreamableHTTPTransport.new(server)
66-
server.transport = transport
6766

6867
# Create a logger for MCP request/response logging
6968
mcp_logger = Logger.new($stdout)

lib/mcp/transport.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ class Transport
77
# Initialize the transport with the server instance
88
def initialize(server)
99
@server = server
10+
server.transport = self
1011
end
1112

1213
# Send a response to the client

test/mcp/progress_test.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ def handle_request(request); end
2626
setup do
2727
@server = Server.new(name: "test_server")
2828
@transport = MockTransport.new(@server)
29-
@server.transport = @transport
3029
@session = ServerSession.new(server: @server, transport: @transport)
3130
end
3231

test/mcp/server/transports/stdio_notification_integration_test.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ def closed?
6161
resources: [],
6262
)
6363
@transport = StdioTransport.new(@server)
64-
@server.transport = @transport
6564
end
6665

6766
teardown do

test/mcp/server/transports/streamable_http_notification_integration_test.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ class StreamableHTTPNotificationIntegrationTest < ActiveSupport::TestCase
1515
resources: [],
1616
)
1717
@transport = StreamableHTTPTransport.new(@server)
18-
@server.transport = @transport
1918
end
2019

2120
test "server notification methods send SSE notifications through HTTP transport" do

test/mcp/server/transports/streamable_http_transport_test.rb

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2591,7 +2591,6 @@ def string
25912591
server = Server.new(name: "test", tools: [], prompts: [], resources: [])
25922592
server.logging_message_notification = MCP::LoggingMessageNotification.new(level: "debug")
25932593
transport = StreamableHTTPTransport.new(server)
2594-
server.transport = transport
25952594

25962595
server.define_tool(name: "log_tool") do |server_context:|
25972596
server_context.notify_log_message(data: "secret", level: "info")
@@ -2668,7 +2667,6 @@ def string
26682667
test "session-scoped progress notification is sent only to the originating session" do
26692668
server = Server.new(name: "test", tools: [], prompts: [], resources: [])
26702669
transport = StreamableHTTPTransport.new(server)
2671-
server.transport = transport
26722670

26732671
server.define_tool(name: "progress_tool") do |server_context:|
26742672
server_context.report_progress(50, total: 100, message: "halfway")
@@ -2749,7 +2747,6 @@ def string
27492747
test "each session stores its own client info independently" do
27502748
server = Server.new(name: "test", tools: [], prompts: [], resources: [])
27512749
transport = StreamableHTTPTransport.new(server)
2752-
server.transport = transport
27532750

27542751
# Initialize session 1 with client "alpha".
27552752
init1 = create_rack_request(
@@ -2794,7 +2791,6 @@ def string
27942791
test "each session stores its own logging level independently" do
27952792
server = Server.new(name: "test", tools: [], prompts: [], resources: [])
27962793
transport = StreamableHTTPTransport.new(server)
2797-
server.transport = transport
27982794

27992795
# Initialize two sessions.
28002796
init1 = create_rack_request(

test/mcp/server_notification_test.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ def handle_request(request); end
3636
)
3737

3838
@mock_transport = MockTransport.new(@server)
39-
@server.transport = @mock_transport
4039
end
4140

4241
test "#notify_tools_list_changed sends notification through transport" do
@@ -122,14 +121,13 @@ def handle_request(request); end
122121
end
123122

124123
test "notification methods handle transport errors gracefully" do
125-
# Create a transport that raises errors
126-
error_transport = Class.new(MockTransport) do
124+
# Replace server's transport with one that raises on send_notification.
125+
Class.new(MockTransport) do
127126
def send_notification(method, params = nil)
128127
raise StandardError, "Transport error"
129128
end
130129
end.new(@server)
131130

132-
@server.transport = error_transport
133131
@server.logging_message_notification = MCP::LoggingMessageNotification.new(level: "error")
134132

135133
# Mock the exception reporter

0 commit comments

Comments
 (0)