Module: Hitch::MCP::Internal::ServerInfo

Defined in:
app/models/hitch/mcp/internal/server_info.rb

Overview

Validates the host's mcp.server_info result into the frozen, string-keyed identity hash the SDK boundary requires.

Constant Summary collapse

KEY_MAP =
{
  "name" => "name",
  "version" => "version",
  "title" => "title",
  "instructions" => "instructions",
  name: "name",
  version: "version",
  title: "title",
  instructions: "instructions"
}.freeze

Class Method Summary collapse

Class Method Details

.normalize(value) ⇒ Object

Raises:

  • (ArgumentError)


22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'app/models/hitch/mcp/internal/server_info.rb', line 22

def normalize(value)
  raise ArgumentError, "mcp.server_info must return a Hash" unless value.is_a?(Hash)

  unknown = value.keys - KEY_MAP.keys
  raise ArgumentError, "mcp.server_info contains unsupported keys" unless unknown.empty?

  canonical_keys = value.keys.map { |key| KEY_MAP.fetch(key) }
  raise ArgumentError, "mcp.server_info contains duplicate keys" unless canonical_keys.uniq == canonical_keys

  normalized = value.to_h do |key, field|
    [ KEY_MAP.fetch(key).dup.freeze, string_field(field) ]
  end
  %w[name version].each do |required|
    field = normalized[required]
    raise ArgumentError, "mcp.server_info requires name and version" unless field.is_a?(String) && !field.empty?
  end
  normalized.freeze
end

.string_field(value) ⇒ Object

Raises:

  • (ArgumentError)


41
42
43
44
45
# File 'app/models/hitch/mcp/internal/server_info.rb', line 41

def string_field(value)
  raise ArgumentError, "mcp.server_info values must be strings" unless value.is_a?(String)

  value.dup.freeze
end