Class: RailsAiBridge::Config::Mcp

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_ai_bridge/config/mcp.rb

Overview

Holds MCP HTTP operational settings: rate limiting, structured logging, post-auth authorization, and production boot guards.

Access via +RailsAiBridge.configuration.mcp+.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeMcp

Returns a new instance of Mcp.



71
72
73
74
75
76
77
78
79
80
# File 'lib/rails_ai_bridge/config/mcp.rb', line 71

def initialize
  @mode                     = :hybrid
  @security_profile         = :balanced
  @rate_limit_max_requests  = nil
  @rate_limit_window_seconds = 60
  @http_log_json            = false
  @authorize                = nil
  @require_auth_in_production = false
  @require_http_auth          = false
end

Instance Attribute Details

#authorizeProc?

Optional lambda called after successful auth: +->(context, request) { truthy }+. Returning falsey yields HTTP 403.

Returns:

  • (Proc, nil)


60
61
62
# File 'lib/rails_ai_bridge/config/mcp.rb', line 60

def authorize
  @authorize
end

#http_log_jsonBoolean

When +true+, MCP HTTP decisions emit one JSON line per response.

Returns:

  • (Boolean)


55
56
57
# File 'lib/rails_ai_bridge/config/mcp.rb', line 55

def http_log_json
  @http_log_json
end

#modeSymbol

Controls when implicit HTTP rate limits apply. +:dev+ — no implicit limit. +:production+ — implicit limit from #security_profile in every environment. +:hybrid+ — implicit limit only when +Rails.env.production?+.

Returns:

  • (Symbol)


14
15
16
# File 'lib/rails_ai_bridge/config/mcp.rb', line 14

def mode
  @mode
end

#rate_limit_max_requestsInteger, ...

Explicit requests allowed per #rate_limit_window_seconds per client IP. +nil+ uses #security_profile defaults unless #http_rate_limit_implicitly_suppressed?. +0+ or negative disables rate limiting entirely.

Returns:

  • (Integer, String, nil)


25
26
27
# File 'lib/rails_ai_bridge/config/mcp.rb', line 25

def rate_limit_max_requests
  @rate_limit_max_requests
end

#rate_limit_window_secondsInteger

Sliding window length for the rate limiter (seconds).

Returns:

  • (Integer)


51
52
53
# File 'lib/rails_ai_bridge/config/mcp.rb', line 51

def rate_limit_window_seconds
  @rate_limit_window_seconds
end

#require_auth_in_productionBoolean

When +true+ in production, boot fails unless an MCP auth mechanism is configured.

Returns:

  • (Boolean)


64
65
66
# File 'lib/rails_ai_bridge/config/mcp.rb', line 64

def require_auth_in_production
  @require_auth_in_production
end

#require_http_authBoolean

When +true+, HTTP MCP requests receive +401+ unless a Bearer/JWT/static auth strategy is configured. Off by default for backward compatibility (stdio and local dev HTTP).

Returns:

  • (Boolean)


69
70
71
# File 'lib/rails_ai_bridge/config/mcp.rb', line 69

def require_http_auth
  @require_http_auth
end

#security_profileSymbol

Default MCP HTTP rate ceiling per IP when #rate_limit_max_requests is +nil+. +:strict+ 60, +:balanced+ 300, +:relaxed+ 1200 requests per #rate_limit_window_seconds.

Returns:

  • (Symbol)


19
20
21
# File 'lib/rails_ai_bridge/config/mcp.rb', line 19

def security_profile
  @security_profile
end

Instance Method Details

#effective_http_rate_limit_max_requestsInteger

Effective rate-limit ceiling for HttpTransportApp (+0+ means disabled).

Returns:

  • (Integer)


89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/rails_ai_bridge/config/mcp.rb', line 89

def effective_http_rate_limit_max_requests
  raw = @rate_limit_max_requests

  case raw
  when Integer
    return 0 if raw <= 0

    raw
  when nil
    return 0 if http_rate_limit_implicitly_suppressed?

    security_profile_rate_limit_max
  else
    n = raw.to_i
    return 0 if n <= 0

    n
  end
end

#effective_http_rate_limit_window_secondsInteger

Window length passed to Mcp::HttpRateLimiter (normalizes non-positive to 60).

Returns:

  • (Integer)


112
113
114
115
# File 'lib/rails_ai_bridge/config/mcp.rb', line 112

def effective_http_rate_limit_window_seconds
  w = @rate_limit_window_seconds.to_i
  w <= 0 ? 60 : w
end

#http_rate_limit_implicitly_suppressed?Boolean

Returns +true+ when a +nil+ max should not inherit #security_profile defaults.

Returns:

  • (Boolean)

    +true+ when a +nil+ max should not inherit #security_profile defaults



118
119
120
121
122
123
124
# File 'lib/rails_ai_bridge/config/mcp.rb', line 118

def http_rate_limit_implicitly_suppressed?
  case (@mode || :hybrid).to_sym
  when :dev        then true
  when :hybrid     then !Rails.env.production?
  else false
  end
end