Class: McpOnRuby::Resource

Inherits:
Object
  • Object
show all
Defined in:
lib/mcp_on_ruby/resource.rb

Overview

Base class for MCP resources - data sources that AI can read

Direct Known Subclasses

ApplicationResource

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(uri:, name: nil, description: '', mime_type: 'application/json', metadata: {}, tags: []) ⇒ Resource

Create a new resource

Parameters:

  • uri (String)

    The resource URI (supports templates with param)

  • name (String) (defaults to: nil)

    Optional human-readable name

  • description (String) (defaults to: '')

    Resource description

  • mime_type (String) (defaults to: 'application/json')

    MIME type of the resource content

  • metadata (Hash) (defaults to: {})

    Additional metadata

  • tags (Array<String>) (defaults to: [])

    Tags for categorization



15
16
17
18
19
20
21
22
# File 'lib/mcp_on_ruby/resource.rb', line 15

def initialize(uri:, name: nil, description: '', mime_type: 'application/json', metadata: {}, tags: [])
  @uri = uri.to_s
  @name = name
  @description = description
  @mime_type = mime_type
  @metadata = 
  @tags = Array(tags)
end

Instance Attribute Details

#descriptionObject (readonly)

Returns the value of attribute description.



6
7
8
# File 'lib/mcp_on_ruby/resource.rb', line 6

def description
  @description
end

#metadataObject (readonly)

Returns the value of attribute metadata.



6
7
8
# File 'lib/mcp_on_ruby/resource.rb', line 6

def 
  @metadata
end

#mime_typeObject (readonly)

Returns the value of attribute mime_type.



6
7
8
# File 'lib/mcp_on_ruby/resource.rb', line 6

def mime_type
  @mime_type
end

#nameObject (readonly)

Returns the value of attribute name.



6
7
8
# File 'lib/mcp_on_ruby/resource.rb', line 6

def name
  @name
end

#tagsObject (readonly)

Returns the value of attribute tags.



6
7
8
# File 'lib/mcp_on_ruby/resource.rb', line 6

def tags
  @tags
end

#uriObject (readonly)

Returns the value of attribute uri.



6
7
8
# File 'lib/mcp_on_ruby/resource.rb', line 6

def uri
  @uri
end

Instance Method Details

#authorized?(context = {}) ⇒ Boolean

Check if resource is authorized for the given context

Parameters:

  • context (Hash) (defaults to: {})

    Request context

Returns:

  • (Boolean)

    True if authorized



91
92
93
94
95
96
97
98
# File 'lib/mcp_on_ruby/resource.rb', line 91

def authorized?(context = {})
  return true unless respond_to?(:authorize, true)
  
  authorize(context)
rescue => error
  McpOnRuby.logger.warn("Authorization check failed for resource '#{uri}': #{error.message}")
  false
end

#read(params = {}, context = {}) ⇒ Hash

Read the resource content with given parameters

Parameters:

  • params (Hash) (defaults to: {})

    URI template parameters

  • context (Hash) (defaults to: {})

    Request context (headers, user info, etc.)

Returns:

  • (Hash)

    The resource content wrapped in MCP format



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/mcp_on_ruby/resource.rb', line 28

def read(params = {}, context = {})
  # Validate parameters if this is a template
  validate_template_params!(params) if template?
  
  # Get the content
  content = fetch_content(params, context)
  
  # Wrap in MCP resource format
  {
    contents: [
      {
        uri: resolve_uri(params),
        mimeType: mime_type,
        text: serialize_content(content)
      }
    ]
  }
rescue => error
  McpOnRuby.logger.error("Resource '#{uri}' read failed: #{error.message}")
  McpOnRuby.logger.error(error.backtrace.join("\n"))
  
  {
    error: {
      code: -32603,
      message: "Resource read failed: #{error.message}",
      data: { uri: uri, error_type: error.class.name }
    }
  }
end

#template?Boolean

Check if this resource is a template (contains param placeholders)

Returns:

  • (Boolean)

    True if resource URI contains template parameters



76
77
78
# File 'lib/mcp_on_ruby/resource.rb', line 76

def template?
  uri.include?('{') && uri.include?('}')
end

#template_paramsArray<String>

Extract parameter names from template URI

Returns:

  • (Array<String>)

    Parameter names



82
83
84
85
86
# File 'lib/mcp_on_ruby/resource.rb', line 82

def template_params
  return [] unless template?
  
  uri.scan(/\{([^}]+)\}/).flatten
end

#to_schemaHash

Get the resource schema for MCP protocol

Returns:

  • (Hash)

    The resource schema



60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/mcp_on_ruby/resource.rb', line 60

def to_schema
  schema = {
    uri: uri,
    mimeType: mime_type
  }
  
  schema[:name] = name if name
  schema[:description] = description unless description.empty?
  schema[:metadata] =  unless .empty?
  schema[:tags] = tags unless tags.empty?
  
  schema
end