Module: HTM::MCP::Server

Defined in:
lib/htm/mcp/server.rb

Overview

MCP Server setup and lifecycle management

Class Method Summary collapse

Class Method Details

.check_database_config!Object



30
31
32
33
34
35
36
# File 'lib/htm/mcp/server.rb', line 30

def check_database_config!
  return if ENV['HTM_DATABASE__URL'] || ENV['HTM_DATABASE__NAME']
  warn "Error: Database not configured."
  warn "Set HTM_DATABASE__URL or HTM_DATABASE__NAME environment variable."
  warn "Run 'htm_mcp help' for details."
  exit 1
end

.configure_htm!Object



70
71
72
73
74
75
76
# File 'lib/htm/mcp/server.rb', line 70

def configure_htm!
  HTM.configure do |config|
    # Job backend now comes from config (defaults to :fiber)
    # Use HTM_JOB__BACKEND=inline or config file to override
    config.logger = @silent_logger  # Silent logging for MCP
  end
end

.configure_logging!Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/htm/mcp/server.rb', line 49

def configure_logging!
  # IMPORTANT: MCP uses STDIO for JSON-RPC communication.
  # ALL logging must go to STDERR to avoid corrupting the protocol.
  @stderr_logger = Logger.new($stderr)
  @stderr_logger.level = Logger::INFO
  @stderr_logger.formatter = proc do |severity, datetime, _progname, msg|
    "[MCP #{severity}] #{datetime.strftime('%H:%M:%S')} #{msg}\n"
  end

  # Silent logger for RubyLLM/HTM internals (prevents STDOUT corruption)
  @silent_logger = Logger.new(IO::NULL)

  # Configure RubyLLM to not log to STDOUT (corrupts MCP protocol)
  RubyLLM.configure do |config|
    config.logger = @silent_logger
  end

  # Set logger for MCP session
  Session.logger = @stderr_logger
end

.create_serverObject



78
79
80
81
82
83
# File 'lib/htm/mcp/server.rb', line 78

def create_server
  FastMcp::Server.new(
    name:    'htm-memory-server',
    version: HTM::VERSION
  )
end

.register_resources(server) ⇒ Object



93
94
95
# File 'lib/htm/mcp/server.rb', line 93

def register_resources(server)
  RESOURCES.each { |resource| server.register_resource(resource) }
end

.register_tools(server) ⇒ Object



85
86
87
88
89
90
91
# File 'lib/htm/mcp/server.rb', line 85

def register_tools(server)
  # Register individual robot/memory tools
  TOOLS.each { |tool| server.register_tool(tool) }

  # Register group tools
  GROUP_TOOLS.each { |tool| server.register_tool(tool) }
end

.startObject



17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/htm/mcp/server.rb', line 17

def start
  check_database_config!
  verify_database_connection!
  configure_logging!
  configure_htm!

  server = create_server
  register_tools(server)
  register_resources(server)

  server.start
end

.verify_database_connection!Object



38
39
40
41
42
43
44
45
46
47
# File 'lib/htm/mcp/server.rb', line 38

def verify_database_connection!
  HTM::SequelConfig.establish_connection!
  # Quick connectivity test
  HTM.db.execute("SELECT 1")
rescue => e
  warn "Error: Cannot connect to database."
  warn e.message
  CLI.print_error_suggestion(e.message)
  exit 1
end