commit
ab4f0807d4
7 changed files with 139 additions and 15 deletions
|
|
@ -3,6 +3,7 @@
|
|||
require_relative "json_rpc_handler"
|
||||
require_relative "mcp/configuration"
|
||||
require_relative "mcp/content"
|
||||
require_relative "mcp/icon"
|
||||
require_relative "mcp/instrumentation"
|
||||
require_relative "mcp/methods"
|
||||
require_relative "mcp/prompt"
|
||||
|
|
|
|||
22
lib/mcp/icon.rb
Normal file
22
lib/mcp/icon.rb
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module MCP
|
||||
class Icon
|
||||
SUPPORTED_THEMES = ["light", "dark"]
|
||||
|
||||
attr_reader :mime_type, :sizes, :src, :theme
|
||||
|
||||
def initialize(mime_type: nil, sizes: nil, src: nil, theme: nil)
|
||||
raise ArgumentError, 'The value of theme must specify "light" or "dark".' if theme && !SUPPORTED_THEMES.include?(theme)
|
||||
|
||||
@mime_type = mime_type
|
||||
@sizes = sizes
|
||||
@src = src
|
||||
@theme = theme
|
||||
end
|
||||
|
||||
def to_h
|
||||
{ mimeType: mime_type, sizes: sizes, src: src, theme: theme }.compact
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -7,6 +7,7 @@ module MCP
|
|||
|
||||
attr_reader :title_value
|
||||
attr_reader :description_value
|
||||
attr_reader :icons_value
|
||||
attr_reader :arguments_value
|
||||
attr_reader :meta_value
|
||||
|
||||
|
|
@ -19,6 +20,7 @@ module MCP
|
|||
name: name_value,
|
||||
title: title_value,
|
||||
description: description_value,
|
||||
icons: icons&.map(&:to_h),
|
||||
arguments: arguments_value&.map(&:to_h),
|
||||
_meta: meta_value,
|
||||
}.compact
|
||||
|
|
@ -29,6 +31,7 @@ module MCP
|
|||
subclass.instance_variable_set(:@name_value, nil)
|
||||
subclass.instance_variable_set(:@title_value, nil)
|
||||
subclass.instance_variable_set(:@description_value, nil)
|
||||
subclass.instance_variable_set(:@icons_value, nil)
|
||||
subclass.instance_variable_set(:@arguments_value, nil)
|
||||
subclass.instance_variable_set(:@meta_value, nil)
|
||||
end
|
||||
|
|
@ -61,6 +64,14 @@ module MCP
|
|||
end
|
||||
end
|
||||
|
||||
def icons(value = NOT_SET)
|
||||
if value == NOT_SET
|
||||
@icons_value
|
||||
else
|
||||
@icons_value = value
|
||||
end
|
||||
end
|
||||
|
||||
def arguments(value = NOT_SET)
|
||||
if value == NOT_SET
|
||||
@arguments_value
|
||||
|
|
@ -77,11 +88,12 @@ module MCP
|
|||
end
|
||||
end
|
||||
|
||||
def define(name: nil, title: nil, description: nil, arguments: [], meta: nil, &block)
|
||||
def define(name: nil, title: nil, description: nil, icons: [], arguments: [], meta: nil, &block)
|
||||
Class.new(self) do
|
||||
prompt_name name
|
||||
title title
|
||||
description description
|
||||
icons icons
|
||||
arguments arguments
|
||||
define_singleton_method(:template) do |args, server_context: nil|
|
||||
instance_exec(args, server_context:, &block)
|
||||
|
|
|
|||
|
|
@ -2,13 +2,14 @@
|
|||
|
||||
module MCP
|
||||
class Resource
|
||||
attr_reader :uri, :name, :title, :description, :mime_type
|
||||
attr_reader :uri, :name, :title, :description, :icons, :mime_type
|
||||
|
||||
def initialize(uri:, name:, title: nil, description: nil, mime_type: nil)
|
||||
def initialize(uri:, name:, title: nil, description: nil, icons: [], mime_type: nil)
|
||||
@uri = uri
|
||||
@name = name
|
||||
@title = title
|
||||
@description = description
|
||||
@icons = icons
|
||||
@mime_type = mime_type
|
||||
end
|
||||
|
||||
|
|
@ -18,6 +19,7 @@ module MCP
|
|||
name: name,
|
||||
title: title,
|
||||
description: description,
|
||||
icons: icons.map(&:to_h),
|
||||
mimeType: mime_type,
|
||||
}.compact
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,13 +2,14 @@
|
|||
|
||||
module MCP
|
||||
class ResourceTemplate
|
||||
attr_reader :uri_template, :name, :title, :description, :mime_type
|
||||
attr_reader :uri_template, :name, :title, :description, :icons, :mime_type
|
||||
|
||||
def initialize(uri_template:, name:, title: nil, description: nil, mime_type: nil)
|
||||
def initialize(uri_template:, name:, title: nil, description: nil, icons: [], mime_type: nil)
|
||||
@uri_template = uri_template
|
||||
@name = name
|
||||
@title = title
|
||||
@description = description
|
||||
@icons = icons
|
||||
@mime_type = mime_type
|
||||
end
|
||||
|
||||
|
|
@ -18,6 +19,7 @@ module MCP
|
|||
name: name,
|
||||
title: title,
|
||||
description: description,
|
||||
icons: icons.map(&:to_h),
|
||||
mimeType: mime_type,
|
||||
}.compact
|
||||
end
|
||||
|
|
|
|||
|
|
@ -40,10 +40,11 @@ module MCP
|
|||
|
||||
include Instrumentation
|
||||
|
||||
attr_accessor :description, :name, :title, :version, :website_url, :instructions, :tools, :prompts, :resources, :server_context, :configuration, :capabilities, :transport
|
||||
attr_accessor :description, :icons, :name, :title, :version, :website_url, :instructions, :tools, :prompts, :resources, :server_context, :configuration, :capabilities, :transport
|
||||
|
||||
def initialize(
|
||||
description: nil,
|
||||
icons: [],
|
||||
name: "model_context_protocol",
|
||||
title: nil,
|
||||
version: DEFAULT_VERSION,
|
||||
|
|
@ -59,6 +60,7 @@ module MCP
|
|||
transport: nil
|
||||
)
|
||||
@description = description
|
||||
@icons = icons
|
||||
@name = name
|
||||
@title = title
|
||||
@version = version
|
||||
|
|
@ -288,6 +290,7 @@ module MCP
|
|||
def server_info
|
||||
@server_info ||= {
|
||||
description:,
|
||||
icons:,
|
||||
name:,
|
||||
title:,
|
||||
version:,
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ module MCP
|
|||
|
||||
attr_reader :title_value
|
||||
attr_reader :description_value
|
||||
attr_reader :icons_value
|
||||
attr_reader :annotations_value
|
||||
attr_reader :meta_value
|
||||
|
||||
|
|
@ -19,6 +20,7 @@ module MCP
|
|||
name: name_value,
|
||||
title: title_value,
|
||||
description: description_value,
|
||||
icons: icons&.map(&:to_h),
|
||||
inputSchema: input_schema_value.to_h,
|
||||
outputSchema: @output_schema_value&.to_h,
|
||||
annotations: annotations_value&.to_h,
|
||||
|
|
@ -31,6 +33,7 @@ module MCP
|
|||
subclass.instance_variable_set(:@name_value, nil)
|
||||
subclass.instance_variable_set(:@title_value, nil)
|
||||
subclass.instance_variable_set(:@description_value, nil)
|
||||
subclass.instance_variable_set(:@icons_value, nil)
|
||||
subclass.instance_variable_set(:@input_schema_value, nil)
|
||||
subclass.instance_variable_set(:@output_schema_value, nil)
|
||||
subclass.instance_variable_set(:@annotations_value, nil)
|
||||
|
|
@ -71,6 +74,14 @@ module MCP
|
|||
end
|
||||
end
|
||||
|
||||
def icons(value = NOT_SET)
|
||||
if value == NOT_SET
|
||||
@icons_value
|
||||
else
|
||||
@icons_value = value
|
||||
end
|
||||
end
|
||||
|
||||
def input_schema(value = NOT_SET)
|
||||
if value == NOT_SET
|
||||
input_schema_value
|
||||
|
|
@ -107,11 +118,12 @@ module MCP
|
|||
end
|
||||
end
|
||||
|
||||
def define(name: nil, title: nil, description: nil, input_schema: nil, output_schema: nil, meta: nil, annotations: nil, &block)
|
||||
def define(name: nil, title: nil, description: nil, icons: [], input_schema: nil, output_schema: nil, meta: nil, annotations: nil, &block)
|
||||
Class.new(self) do
|
||||
tool_name name
|
||||
title title
|
||||
description description
|
||||
icons icons
|
||||
input_schema input_schema
|
||||
meta meta
|
||||
output_schema output_schema
|
||||
|
|
|
|||
Loading…
Reference in a new issue