rails-profiler 0.23.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/profiler/mcp/server.rb +56 -0
- data/lib/profiler/mcp/tools/delete_env_var.rb +20 -0
- data/lib/profiler/mcp/tools/list_env_vars.rb +57 -0
- data/lib/profiler/mcp/tools/reset_all_env_vars.rb +22 -0
- data/lib/profiler/mcp/tools/reset_env_var.rb +26 -0
- data/lib/profiler/mcp/tools/set_env_var.rb +21 -0
- data/lib/profiler/version.rb +1 -1
- metadata +7 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7470de2ae63f1df27d88a861cfc022dbd4a7323e69195d7d0987dab1ada89689
|
|
4
|
+
data.tar.gz: eb002b0b052032a60e1f348cde049f8957bee12f6305a81c3081c8217f036d22
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a6dea6a9037b7d031699b1604722de35dcdc0ed59116c346ad4b627c986ac1af532740f0c7293321a3ccd468c6f0e5c44ef7765ea93ea2b7897948a93474b622
|
|
7
|
+
data.tar.gz: 9c8bd2f0a48dfd3670a4089c5b4a29f00943d7ed282bb4b30e2a58bb198812203385680b0be0352df4a46d53668679377c964def5385f1c29c3d12cbc0467469
|
data/lib/profiler/mcp/server.rb
CHANGED
|
@@ -72,6 +72,11 @@ module Profiler
|
|
|
72
72
|
require_relative "tools/query_jobs"
|
|
73
73
|
require_relative "tools/query_mailers"
|
|
74
74
|
require_relative "tools/clear_profiles"
|
|
75
|
+
require_relative "tools/list_env_vars"
|
|
76
|
+
require_relative "tools/set_env_var"
|
|
77
|
+
require_relative "tools/delete_env_var"
|
|
78
|
+
require_relative "tools/reset_env_var"
|
|
79
|
+
require_relative "tools/reset_all_env_vars"
|
|
75
80
|
|
|
76
81
|
[
|
|
77
82
|
define_tool(
|
|
@@ -207,6 +212,57 @@ module Profiler
|
|
|
207
212
|
}
|
|
208
213
|
},
|
|
209
214
|
handler: Tools::ClearProfiles
|
|
215
|
+
),
|
|
216
|
+
define_tool(
|
|
217
|
+
name: "list_env_vars",
|
|
218
|
+
description: "List environment variables. By default shows only active overrides. Pass include_all: true to see all ENV vars.",
|
|
219
|
+
input_schema: {
|
|
220
|
+
properties: {
|
|
221
|
+
include_all: { type: "boolean", description: "If true, return all ENV variables (not just overrides). Default: false." },
|
|
222
|
+
filter: { type: "string", description: "Case-insensitive substring filter on key name." }
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
handler: Tools::ListEnvVars
|
|
226
|
+
),
|
|
227
|
+
define_tool(
|
|
228
|
+
name: "set_env_var",
|
|
229
|
+
description: "Set an environment variable and persist the override across app restarts.",
|
|
230
|
+
input_schema: {
|
|
231
|
+
properties: {
|
|
232
|
+
key: { type: "string", description: "Environment variable name (required)" },
|
|
233
|
+
value: { type: "string", description: "New value (required)" }
|
|
234
|
+
},
|
|
235
|
+
required: ["key", "value"]
|
|
236
|
+
},
|
|
237
|
+
handler: Tools::SetEnvVar
|
|
238
|
+
),
|
|
239
|
+
define_tool(
|
|
240
|
+
name: "delete_env_var",
|
|
241
|
+
description: "Delete an environment variable for this session (persisted across restarts until reset).",
|
|
242
|
+
input_schema: {
|
|
243
|
+
properties: {
|
|
244
|
+
key: { type: "string", description: "Environment variable name (required)" }
|
|
245
|
+
},
|
|
246
|
+
required: ["key"]
|
|
247
|
+
},
|
|
248
|
+
handler: Tools::DeleteEnvVar
|
|
249
|
+
),
|
|
250
|
+
define_tool(
|
|
251
|
+
name: "reset_env_var",
|
|
252
|
+
description: "Restore an overridden environment variable to its original value.",
|
|
253
|
+
input_schema: {
|
|
254
|
+
properties: {
|
|
255
|
+
key: { type: "string", description: "Environment variable name to restore (required)" }
|
|
256
|
+
},
|
|
257
|
+
required: ["key"]
|
|
258
|
+
},
|
|
259
|
+
handler: Tools::ResetEnvVar
|
|
260
|
+
),
|
|
261
|
+
define_tool(
|
|
262
|
+
name: "reset_all_env_vars",
|
|
263
|
+
description: "Restore all overridden environment variables to their original values.",
|
|
264
|
+
input_schema: { properties: {} },
|
|
265
|
+
handler: Tools::ResetAllEnvVars
|
|
210
266
|
)
|
|
211
267
|
]
|
|
212
268
|
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Profiler
|
|
4
|
+
module MCP
|
|
5
|
+
module Tools
|
|
6
|
+
class DeleteEnvVar
|
|
7
|
+
def self.call(params)
|
|
8
|
+
key = params["key"].to_s.strip
|
|
9
|
+
|
|
10
|
+
return [{ type: "text", text: "Error: key cannot be blank." }] if key.empty?
|
|
11
|
+
|
|
12
|
+
Profiler.env_override_store.delete(key)
|
|
13
|
+
ENV.delete(key)
|
|
14
|
+
|
|
15
|
+
[{ type: "text", text: "Deleted #{key}. Override persisted — will remain deleted across restarts until reset." }]
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Profiler
|
|
4
|
+
module MCP
|
|
5
|
+
module Tools
|
|
6
|
+
class ListEnvVars
|
|
7
|
+
def self.call(params)
|
|
8
|
+
include_all = params["include_all"]
|
|
9
|
+
filter = params["filter"]&.downcase
|
|
10
|
+
|
|
11
|
+
if include_all
|
|
12
|
+
vars = ENV.to_h.sort.to_h
|
|
13
|
+
overrides = Profiler.env_override_store.all_overrides
|
|
14
|
+
|
|
15
|
+
vars = vars.select { |k, _| k.downcase.include?(filter) } if filter
|
|
16
|
+
|
|
17
|
+
if vars.empty?
|
|
18
|
+
return [{ type: "text", text: "No environment variables match filter '#{params["filter"]}'." }]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
rows = vars.map do |key, value|
|
|
22
|
+
override = overrides[key]
|
|
23
|
+
overridden = override ? "✓ (was: #{override["original"] || "(unset)"})" : ""
|
|
24
|
+
"| #{key} | #{value} | #{overridden} |"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
text = "**ENV variables (#{vars.size}#{filter ? ", filtered by '#{params["filter"]}'" : ""})**\n\n"
|
|
28
|
+
text += "| Key | Current Value | Overridden |\n"
|
|
29
|
+
text += "|-----|--------------|------------|\n"
|
|
30
|
+
text += rows.join("\n")
|
|
31
|
+
else
|
|
32
|
+
overrides = Profiler.env_override_store.all_overrides
|
|
33
|
+
overrides = overrides.select { |k, _| k.downcase.include?(filter) } if filter
|
|
34
|
+
|
|
35
|
+
if overrides.empty?
|
|
36
|
+
msg = filter ? "No overrides match filter '#{params["filter"]}'." : "No overrides active."
|
|
37
|
+
return [{ type: "text", text: msg }]
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
rows = overrides.map do |key, entry|
|
|
41
|
+
current = entry["value"] == EnvOverrideStore::DELETED_SENTINEL ? "(deleted)" : entry["value"]
|
|
42
|
+
original = entry["original"] || "(unset)"
|
|
43
|
+
"| #{key} | #{current} | #{original} |"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
text = "**Active ENV overrides (#{overrides.size})**\n\n"
|
|
47
|
+
text += "| Key | Current Value | Original Value |\n"
|
|
48
|
+
text += "|-----|--------------|----------------|\n"
|
|
49
|
+
text += rows.join("\n")
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
[{ type: "text", text: text }]
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Profiler
|
|
4
|
+
module MCP
|
|
5
|
+
module Tools
|
|
6
|
+
class ResetAllEnvVars
|
|
7
|
+
def self.call(_params)
|
|
8
|
+
overrides = Profiler.env_override_store.all_overrides
|
|
9
|
+
count = overrides.size
|
|
10
|
+
|
|
11
|
+
if count.zero?
|
|
12
|
+
return [{ type: "text", text: "No active overrides to reset." }]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
Profiler.env_override_store.reset_all
|
|
16
|
+
|
|
17
|
+
[{ type: "text", text: "Reset #{count} environment variable#{"s" if count != 1} to original values." }]
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Profiler
|
|
4
|
+
module MCP
|
|
5
|
+
module Tools
|
|
6
|
+
class ResetEnvVar
|
|
7
|
+
def self.call(params)
|
|
8
|
+
key = params["key"].to_s.strip
|
|
9
|
+
|
|
10
|
+
return [{ type: "text", text: "Error: key cannot be blank." }] if key.empty?
|
|
11
|
+
|
|
12
|
+
overrides = Profiler.env_override_store.all_overrides
|
|
13
|
+
unless overrides.key?(key)
|
|
14
|
+
return [{ type: "text", text: "No active override for #{key}." }]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
original = overrides[key]["original"]
|
|
18
|
+
Profiler.env_override_store.reset(key)
|
|
19
|
+
|
|
20
|
+
restored = original || "(unset)"
|
|
21
|
+
[{ type: "text", text: "Reset #{key} to original value: #{restored}" }]
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Profiler
|
|
4
|
+
module MCP
|
|
5
|
+
module Tools
|
|
6
|
+
class SetEnvVar
|
|
7
|
+
def self.call(params)
|
|
8
|
+
key = params["key"].to_s.strip
|
|
9
|
+
value = params["value"].to_s
|
|
10
|
+
|
|
11
|
+
return [{ type: "text", text: "Error: key cannot be blank." }] if key.empty?
|
|
12
|
+
|
|
13
|
+
Profiler.env_override_store.set(key, value)
|
|
14
|
+
ENV[key] = value
|
|
15
|
+
|
|
16
|
+
[{ type: "text", text: "Set #{key}=#{value}" }]
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
data/lib/profiler/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rails-profiler
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.24.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sébastien Duplessy
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-
|
|
11
|
+
date: 2026-06-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|
|
@@ -161,14 +161,19 @@ files:
|
|
|
161
161
|
- lib/profiler/mcp/server.rb
|
|
162
162
|
- lib/profiler/mcp/tools/analyze_queries.rb
|
|
163
163
|
- lib/profiler/mcp/tools/clear_profiles.rb
|
|
164
|
+
- lib/profiler/mcp/tools/delete_env_var.rb
|
|
164
165
|
- lib/profiler/mcp/tools/explain_query.rb
|
|
165
166
|
- lib/profiler/mcp/tools/get_profile_ajax.rb
|
|
166
167
|
- lib/profiler/mcp/tools/get_profile_detail.rb
|
|
167
168
|
- lib/profiler/mcp/tools/get_profile_dumps.rb
|
|
168
169
|
- lib/profiler/mcp/tools/get_profile_http.rb
|
|
170
|
+
- lib/profiler/mcp/tools/list_env_vars.rb
|
|
169
171
|
- lib/profiler/mcp/tools/query_jobs.rb
|
|
170
172
|
- lib/profiler/mcp/tools/query_mailers.rb
|
|
171
173
|
- lib/profiler/mcp/tools/query_profiles.rb
|
|
174
|
+
- lib/profiler/mcp/tools/reset_all_env_vars.rb
|
|
175
|
+
- lib/profiler/mcp/tools/reset_env_var.rb
|
|
176
|
+
- lib/profiler/mcp/tools/set_env_var.rb
|
|
172
177
|
- lib/profiler/middleware/cors_middleware.rb
|
|
173
178
|
- lib/profiler/middleware/profiler_middleware.rb
|
|
174
179
|
- lib/profiler/middleware/toolbar_injector.rb
|