Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/mcp/prompt.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def to_h
name: name_value,
title: title_value,
description: description_value,
icons: icons&.map(&:to_h),
icons: icons_value&.then { |icons| icons.empty? ? nil : icons.map(&:to_h) },
arguments: arguments_value&.map(&:to_h),
_meta: meta_value,
}.compact
Expand Down
2 changes: 1 addition & 1 deletion lib/mcp/resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def to_h
name: name,
title: title,
description: description,
icons: icons.map(&:to_h),
icons: icons&.then { |icons| icons.empty? ? nil : icons.map(&:to_h) },
mimeType: mime_type,
}.compact
end
Expand Down
2 changes: 1 addition & 1 deletion lib/mcp/resource_template.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def to_h
name: name,
title: title,
description: description,
icons: icons.map(&:to_h),
icons: icons&.then { |icons| icons.empty? ? nil : icons.map(&:to_h) },
mimeType: mime_type,
}.compact
end
Expand Down
2 changes: 1 addition & 1 deletion lib/mcp/server.rb
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ def default_capabilities
def server_info
@server_info ||= {
description: description,
icons: icons,
icons: icons&.then { |icons| icons.empty? ? nil : icons.map(&:to_h) },
name: name,
title: title,
version: version,
Expand Down
2 changes: 1 addition & 1 deletion lib/mcp/tool.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def to_h
name: name_value,
title: title_value,
description: description_value,
icons: icons&.map(&:to_h),
icons: icons_value&.then { |icons| icons.empty? ? nil : icons.map(&:to_h) },
inputSchema: input_schema_value.to_h,
outputSchema: @output_schema_value&.to_h,
annotations: annotations_value&.to_h,
Expand Down
19 changes: 19 additions & 0 deletions test/mcp/prompt_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -195,5 +195,24 @@ class NoArgumentsPrompt < Prompt

assert_equal expected, prompt.to_h
end

test "#to_h does not have `:icons` key when icons is empty" do
prompt = Prompt.define(
name: "prompt_without_icons",
description: "a prompt without icons",
)

refute prompt.to_h.key?(:icons)
end

test "#to_h does not have `:icons` key when icons is nil" do
prompt = Prompt.define(
name: "prompt_without_icons",
description: "a prompt without icons",
icons: nil,
)

refute prompt.to_h.key?(:icons)
end
end
end
40 changes: 40 additions & 0 deletions test/mcp/resource_template_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# frozen_string_literal: true

require "test_helper"

module MCP
class ResourceTemplateTest < ActiveSupport::TestCase
test "#to_h does not have `:icons` key when icons is empty" do
resource_template = ResourceTemplate.new(
uri_template: "file:///{path}",
name: "resource_template_without_icons",
description: "a resource template without icons",
)

refute resource_template.to_h.key?(:icons)
end

test "#to_h does not have `:icons` key when icons is nil" do
resource_template = ResourceTemplate.new(
uri_template: "file:///{path}",
name: "resource_template_without_icons",
description: "a resource template without icons",
icons: nil,
)

refute resource_template.to_h.key?(:icons)
end

test "#to_h includes icons when present" do
resource_template = ResourceTemplate.new(
uri_template: "file:///{path}",
name: "resource_template_with_icons",
description: "a resource template with icons",
icons: [Icon.new(mime_type: "image/png", sizes: ["48x48"], src: "https://example.com", theme: "light")],
)
expected_icons = [{ mimeType: "image/png", sizes: ["48x48"], src: "https://example.com", theme: "light" }]

assert_equal expected_icons, resource_template.to_h[:icons]
end
end
end
40 changes: 40 additions & 0 deletions test/mcp/resource_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# frozen_string_literal: true

require "test_helper"

module MCP
class ResourceTest < ActiveSupport::TestCase
test "#to_h does not have `:icons` key when icons is empty" do
resource = Resource.new(
uri: "file:///test.txt",
name: "resource_without_icons",
description: "a resource without icons",
)

refute resource.to_h.key?(:icons)
end

test "#to_h does not have `:icons` key when icons is nil" do
resource = Resource.new(
uri: "file:///test.txt",
name: "resource_without_icons",
description: "a resource without icons",
icons: nil,
)

refute resource.to_h.key?(:icons)
end

test "#to_h includes icons when present" do
resource = Resource.new(
uri: "file:///test.txt",
name: "resource_with_icons",
description: "a resource with icons",
icons: [Icon.new(mime_type: "image/png", sizes: ["48x48"], src: "https://example.com", theme: "light")],
)
expected_icons = [{ mimeType: "image/png", sizes: ["48x48"], src: "https://example.com", theme: "light" }]

assert_equal expected_icons, resource.to_h[:icons]
end
end
end
40 changes: 40 additions & 0 deletions test/mcp/server_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -895,6 +895,46 @@ class Example < Tool
refute response[:result][:serverInfo].key?(:website_url)
end

test "server response does not include icons when icons is empty" do
server = Server.new(name: "test_server")
request = {
jsonrpc: "2.0",
method: "initialize",
id: 1,
}
response = server.handle(request)

refute response[:result][:serverInfo].key?(:icons)
end

test "server response does not include icons when icons is nil" do
server = Server.new(name: "test_server", icons: nil)
request = {
jsonrpc: "2.0",
method: "initialize",
id: 1,
}
response = server.handle(request)

refute response[:result][:serverInfo].key?(:icons)
end

test "server response includes icons when icons is present" do
server = Server.new(
name: "test_server",
icons: [Icon.new(mime_type: "image/png", sizes: ["48x48"], src: "https://example.com", theme: "light")],
)
request = {
jsonrpc: "2.0",
method: "initialize",
id: 1,
}
response = server.handle(request)
expected_icons = [{ mimeType: "image/png", sizes: ["48x48"], src: "https://example.com", theme: "light" }]

assert_equal expected_icons, response[:result][:serverInfo][:icons]
end

test "server uses default version when not configured" do
server = Server.new(name: "test_server")
request = {
Expand Down
19 changes: 19 additions & 0 deletions test/mcp/tool_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,25 @@ def call(message:, server_context: nil)
refute tool.to_h.key?(:title)
end

test "#to_h does not have `:icons` key when icons is empty" do
tool = Tool.define(
name: "tool_without_icons",
description: "a tool without icons",
)

refute tool.to_h.key?(:icons)
end

test "#to_h does not have `:icons` key when icons is nil" do
tool = Tool.define(
name: "tool_without_icons",
description: "a tool without icons",
icons: nil,
)

refute tool.to_h.key?(:icons)
end

test "#to_h includes annotations when present" do
tool = TestTool
expected_annotations = {
Expand Down