Skip to content

Commit 0c729d0

Browse files
committed
Use autoload to defer loading of unused subsystems
## Motivation and Context `lib/mcp.rb` currently declares all `require_relative` statements in one place. As a result, Server and Client are both loaded, the stdio and Streamable HTTP transports are both loaded, and Tool, Prompt, and Resource are all loaded, regardless of which components are actually used. These components are selected by the user depending on their use case, so loading everything upfront is unnecessary. Using `autoload` for selected constants defers loading until the constant is actually referenced, so only the subsystems required by the user are loaded. ## How Has This Been Tested? All existing tests pass unchanged. ## Breaking Change None. This change only defers loading of unused components.
1 parent a2514a0 commit 0c729d0

File tree

11 files changed

+42
-28
lines changed

11 files changed

+42
-28
lines changed

lib/mcp.rb

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,22 @@
11
# frozen_string_literal: true
22

33
require_relative "json_rpc_handler"
4-
require_relative "mcp/annotations"
54
require_relative "mcp/configuration"
6-
require_relative "mcp/content"
7-
require_relative "mcp/icon"
8-
require_relative "mcp/instrumentation"
9-
require_relative "mcp/methods"
10-
require_relative "mcp/progress"
11-
require_relative "mcp/prompt"
12-
require_relative "mcp/prompt/argument"
13-
require_relative "mcp/prompt/message"
14-
require_relative "mcp/prompt/result"
15-
require_relative "mcp/resource"
16-
require_relative "mcp/resource/contents"
17-
require_relative "mcp/resource/embedded"
18-
require_relative "mcp/resource_template"
19-
require_relative "mcp/server"
20-
require_relative "mcp/server_context"
21-
require_relative "mcp/server/transports/streamable_http_transport"
22-
require_relative "mcp/server/transports/stdio_transport"
235
require_relative "mcp/string_utils"
24-
require_relative "mcp/tool"
25-
require_relative "mcp/tool/input_schema"
26-
require_relative "mcp/tool/output_schema"
27-
require_relative "mcp/tool/response"
28-
require_relative "mcp/tool/annotations"
296
require_relative "mcp/transport"
307
require_relative "mcp/version"
31-
require_relative "mcp/client"
32-
require_relative "mcp/client/http"
33-
require_relative "mcp/client/tool"
348

359
module MCP
10+
autoload :Annotations, "mcp/annotations"
11+
autoload :Client, "mcp/client"
12+
autoload :Content, "mcp/content"
13+
autoload :Icon, "mcp/icon"
14+
autoload :Prompt, "mcp/prompt"
15+
autoload :Resource, "mcp/resource"
16+
autoload :ResourceTemplate, "mcp/resource_template"
17+
autoload :Server, "mcp/server"
18+
autoload :Tool, "mcp/tool"
19+
3620
class << self
3721
def configure
3822
yield(configuration)

lib/mcp/client.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# frozen_string_literal: true
22

3+
require_relative "client/http"
4+
require_relative "client/tool"
5+
36
module MCP
47
class Client
58
# Initializes a new MCP::Client instance.

lib/mcp/prompt.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# frozen_string_literal: true
22

3+
require_relative "prompt/argument"
4+
require_relative "prompt/message"
5+
require_relative "prompt/result"
6+
37
module MCP
48
class Prompt
59
class << self

lib/mcp/resource.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# frozen_string_literal: true
22

3+
require_relative "resource/contents"
4+
require_relative "resource/embedded"
5+
36
module MCP
47
class Resource
58
attr_reader :uri, :name, :title, :description, :icons, :mime_type

lib/mcp/server.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
require_relative "instrumentation"
55
require_relative "methods"
66
require_relative "logging_message_notification"
7+
require_relative "progress"
8+
require_relative "server_context"
9+
require_relative "server/transports"
710

811
module MCP
912
class ToolNotUnique < StandardError

lib/mcp/server/transports.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# frozen_string_literal: true
2+
3+
module MCP
4+
class Server
5+
module Transports
6+
autoload :StdioTransport, "mcp/server/transports/stdio_transport"
7+
autoload :StreamableHTTPTransport, "mcp/server/transports/streamable_http_transport"
8+
end
9+
end
10+
end

lib/mcp/server/transports/stdio_transport.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# frozen_string_literal: true
22

3-
require_relative "../../transport"
43
require "json"
4+
require_relative "../../transport"
55

66
module MCP
77
class Server

lib/mcp/server/transports/streamable_http_transport.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# frozen_string_literal: true
22

3-
require_relative "../../transport"
43
require "json"
54
require "securerandom"
5+
require_relative "../../transport"
66

77
module MCP
88
class Server

lib/mcp/tool.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# frozen_string_literal: true
22

3+
require_relative "tool/annotations"
4+
require_relative "tool/input_schema"
5+
require_relative "tool/output_schema"
6+
require_relative "tool/response"
7+
38
module MCP
49
class Tool
510
class << self

test/mcp/instrumentation_test.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22

33
require "test_helper"
4+
require "mcp/instrumentation"
45

56
module MCP
67
class InstrumentationTest < ActiveSupport::TestCase

0 commit comments

Comments
 (0)