Class: Woods::MCP::ToolResponseRenderer

Inherits:
Object
  • Object
show all
Defined in:
lib/woods/mcp/tool_response_renderer.rb

Overview

Base class for rendering MCP tool responses in different output formats.

Subclasses implement tool-specific render methods (render_lookup, render_search, etc.) and a render_default fallback. The dispatch uses convention: tool name maps to method name.

Examples:

renderer = ToolResponseRenderer.for(:markdown)
renderer.render(:lookup, unit_data)

Constant Summary collapse

VALID_FORMATS =
%i[claude markdown plain json].freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.for(format) ⇒ ToolResponseRenderer

Factory method to build the appropriate renderer for a format.

Parameters:

  • format (Symbol)

    One of :claude, :markdown, :plain, :json

Returns:

Raises:

  • (ArgumentError)

    if format is unknown



22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/woods/mcp/tool_response_renderer.rb', line 22

def self.for(format)
  require_relative 'renderers/markdown_renderer'
  require_relative 'renderers/claude_renderer'
  require_relative 'renderers/plain_renderer'
  require_relative 'renderers/json_renderer'

  case format
  when :claude   then Renderers::ClaudeRenderer.new
  when :markdown then Renderers::MarkdownRenderer.new
  when :plain    then Renderers::PlainRenderer.new
  when :json     then Renderers::JsonRenderer.new
  else raise ArgumentError, "Unknown format: #{format.inspect}. Valid: #{VALID_FORMATS.inspect}"
  end
end

Instance Method Details

#render(tool_name, data, **opts) ⇒ String

Render a tool response. Dispatches to render_<tool_name> if defined, otherwise falls back to render_default.

Parameters:

  • tool_name (Symbol, String)

    The tool name

  • data (Object)

    The tool result data

  • opts (Hash)

    Additional rendering options

Returns:

  • (String)

    Rendered response text



44
45
46
47
48
49
50
51
# File 'lib/woods/mcp/tool_response_renderer.rb', line 44

def render(tool_name, data, **opts)
  method_name = :"render_#{tool_name}"
  if respond_to?(method_name, true)
    send(method_name, data, **opts)
  else
    render_default(data)
  end
end

#render_default(data) ⇒ String

Default rendering — subclasses must implement.

Parameters:

  • data (Object)

    The data to render

Returns:

  • (String)

    Rendered text

Raises:

  • (NotImplementedError)


57
58
59
# File 'lib/woods/mcp/tool_response_renderer.rb', line 57

def render_default(data)
  raise NotImplementedError, "#{self.class}#render_default must be implemented"
end