rails-pg-extras 5.6.10 → 6.0.1

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.

Potentially problematic release.


This version of rails-pg-extras might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2207f16892a3e8d48f92833a2388f4e194b27b2e365f41f6461112510828c2d8
4
- data.tar.gz: f4cde7b6f204d740f520b87b1c3cd04f40d199680adc103e7611fb18ba2caa29
3
+ metadata.gz: 0eb7080dab805a854ce746d67d42ea84e7b315587ea49a952ecafaaa9bc7a3b7
4
+ data.tar.gz: 82004fbeae8c56a47a52bf7ed3880af1c7408fb6a5fdf4fa8acfc91b9261d8e0
5
5
  SHA512:
6
- metadata.gz: 0e0866a4c4a75e3a095c5956163143cc1d451099bfd6a6cd2620b2073439558dcd0510458bb358164b5cdd3f4d12a862cf251571f6885ffb044b93a98db1ef77
7
- data.tar.gz: 3c6dc4a9f5e147c692c64160538ba95749eeb4f9abbb3998a73df7f05c4b8824487c31481ad84511c007a70fffe5f6fd187dde61dd0c57853981c3c8b9de066e
6
+ metadata.gz: 8648efd4fb3f4f53bae5aa397e8aba53341846c7f6af3597c3c1fe66ca4af7f2bd92117014449cb25295ce57b96dadc7defcd2d09e6eff41aa646bb95efb7ed9
7
+ data.tar.gz: 40261d23146c0d9dc0a0c09ca24b980bcc731e6b3199b20825a95208f14519935224d00a626995dea2b2039aaafe4ac671ed4e03acc485cf9d6700995a66f26a
@@ -12,7 +12,7 @@ jobs:
12
12
  strategy:
13
13
  fail-fast: false
14
14
  matrix:
15
- ruby-version: ['3.4', '3.3', '3.2', '3.1', '3.0', '2.7']
15
+ ruby-version: ['3.4', '3.3', '3.2', '3.1']
16
16
  steps:
17
17
  - uses: actions/checkout@v4
18
18
  - name: Run PostgreSQL 12
data/README.md CHANGED
@@ -148,6 +148,43 @@ RailsPgExtras.configure do |config|
148
148
  end
149
149
  ```
150
150
 
151
+ ## MCP LLM integration
152
+
153
+ Library supports MCP protocol via HTTP SSE interface.
154
+
155
+ `config/routes.rb`
156
+
157
+ ```ruby
158
+ # Authentication is not yet supported
159
+ mount RailsPgExtras.mcp_app, at: "pg-extras-mcp"
160
+ ```
161
+
162
+ Install [mcp-remote](https://github.com/geelen/mcp-remote):
163
+
164
+ ```bash
165
+ npm install -g mcp-remote
166
+ ```
167
+
168
+ and in your LLM of choice:
169
+
170
+ ```json
171
+ {
172
+ "mcpServers": {
173
+ "pg-extras": {
174
+ "command": "npx",
175
+ "args": [
176
+ "mcp-remote",
177
+ "http://localhost:3000/pg-extras-mcp/sse"
178
+ ]
179
+ }
180
+ }
181
+ }
182
+ ```
183
+
184
+ You can now ask LLM questions about the metadata and performance metrics of your database.
185
+
186
+ ![Web interface](https://github.com/pawurb/rails-pg-extras/raw/main/pg-extras-mcp.png)
187
+
151
188
  ## Available methods
152
189
 
153
190
  ### `measure_queries`
@@ -3,10 +3,8 @@
3
3
 
4
4
  <br>
5
5
 
6
- <%=
7
- link_to " Back to Diagnose", queries_path,
8
- class: "inline-block bg-blue-500 text-white font-medium px-4 py-2 rounded-lg shadow-md hover:bg-blue-600 transition"
9
- %>
6
+ <%= link_to "← Back to Diagnose", queries_path,
7
+ class: "inline-block bg-blue-500 text-white font-medium px-4 py-2 rounded-lg shadow-md hover:bg-blue-600 transition" %>
10
8
 
11
9
  <% if @error %>
12
10
  <div class="text-red-500 p-3 font-mono my-5"><%= @error %></div>
@@ -1,7 +1,7 @@
1
- <%= form_tag queries_path, id: "queries", method: :get do |f| %>
2
- <%= select_tag :query_name, options_for_select(@all_queries, params[:query_name]),
3
- { prompt: "diagnose", class: "border p-2 font-bold", autofocus: true } %>
4
- <% end %>
1
+ <%= form_tag queries_path, id: "queries", method: :get do |f| %>
2
+ <%= select_tag :query_name, options_for_select(@all_queries, params[:query_name]),
3
+ { prompt: "diagnose", class: "border p-2 font-bold", autofocus: true } %>
4
+ <% end %>
5
5
 
6
6
  <%= javascript_tag nonce: true do -%>
7
7
  document.getElementById('queries').addEventListener('change', (e) => {
@@ -10,6 +10,7 @@ require "rails_pg_extras/missing_fk_indexes"
10
10
  require "rails_pg_extras/missing_fk_constraints"
11
11
  require "rails_pg_extras/table_info"
12
12
  require "rails_pg_extras/table_info_print"
13
+ require "rails_pg_extras/mcp_app"
13
14
 
14
15
  module RailsPgExtras
15
16
  QUERIES = RubyPgExtras::QUERIES
@@ -157,6 +158,10 @@ module RailsPgExtras
157
158
  ActiveRecord::Base.connection
158
159
  end
159
160
  end
161
+
162
+ def self.mcp_app
163
+ RailsPgExtras::MCPApp.build
164
+ end
160
165
  end
161
166
 
162
167
  require "rails_pg_extras/web"
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ # MCP Server Rake Tasks
4
+
5
+ require "fast_mcp"
6
+ require "rack"
7
+ require "rails_pg_extras/version"
8
+
9
+ SKIP_QUERIES = %i[
10
+ add_extensions
11
+ pg_stat_statements_reset
12
+ kill_pid
13
+ kill_all
14
+ mandelbrot
15
+ ]
16
+
17
+ # Dynamically create tool classes for each query
18
+ QUERY_TOOL_CLASSES = RubyPgExtras::QUERIES.reject { |q| SKIP_QUERIES.include?(q) }.map do |query_name|
19
+ Class.new(FastMcp::Tool) do
20
+ description RubyPgExtras.description_for(query_name: query_name)
21
+
22
+ define_method :call do
23
+ RailsPgExtras.public_send(query_name, in_format: :hash)
24
+ end
25
+
26
+ define_singleton_method :name do
27
+ query_name.to_s
28
+ end
29
+ end
30
+ end
31
+
32
+ # Additional specialized tool classes
33
+ class MissingFkConstraintsTool < FastMcp::Tool
34
+ description "Shows missing foreign key constraints"
35
+
36
+ def call
37
+ RailsPgExtras.missing_fk_constraints(in_format: :hash)
38
+ end
39
+
40
+ def self.name
41
+ "missing_fk_constraints"
42
+ end
43
+ end
44
+
45
+ class MissingFkIndexesTool < FastMcp::Tool
46
+ description "Shows missing foreign key indexes"
47
+
48
+ def call
49
+ RailsPgExtras.missing_fk_indexes(in_format: :hash)
50
+ end
51
+
52
+ def self.name
53
+ "missing_fk_indexes"
54
+ end
55
+ end
56
+
57
+ class DiagnoseTool < FastMcp::Tool
58
+ description "Performs a health check of the database"
59
+
60
+ def call
61
+ RailsPgExtras.diagnose(in_format: :hash)
62
+ end
63
+
64
+ def self.name
65
+ "diagnose"
66
+ end
67
+ end
68
+
69
+ class ReadmeResource < FastMcp::Resource
70
+ uri "file://README.md"
71
+ resource_name "README"
72
+ description "The README for RailsPgExtras"
73
+ mime_type "text/plain"
74
+
75
+ def content
76
+ File.read(uri)
77
+ end
78
+ end
79
+
80
+ module RailsPgExtras
81
+ class MCPApp
82
+ def self.build
83
+ app = lambda do |_env|
84
+ [200, { "Content-Type" => "text/html" },
85
+ ["<html><body><h1>Hello from Rack!</h1><p>This is a simple Rack app with MCP middleware.</p></body></html>"]]
86
+ end
87
+
88
+ # Create the MCP middleware
89
+ mcp_app = FastMcp.rack_middleware(
90
+ app,
91
+ name: "rails-pg-extras", version: RailsPgExtras::VERSION,
92
+ path_prefix: "/pg-extras-mcp",
93
+ logger: Logger.new($stdout),
94
+ ) do |server|
95
+ server.register_tools(DiagnoseTool)
96
+ server.register_tools(MissingFkConstraintsTool)
97
+ server.register_tools(MissingFkIndexesTool)
98
+ server.register_tools(*QUERY_TOOL_CLASSES)
99
+
100
+ # Register a sample resource
101
+ server.register_resource(ReadmeResource)
102
+
103
+ Rack::Builder.new { run mcp_app }
104
+ end
105
+ end
106
+ end
107
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsPgExtras
4
- VERSION = "5.6.10"
4
+ VERSION = "6.0.1"
5
5
  end
data/pg-extras-mcp.png ADDED
Binary file
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.license = "MIT"
18
18
  s.add_dependency "ruby-pg-extras", RailsPgExtras::VERSION
19
19
  s.add_dependency "rails"
20
+ s.add_dependency "fast-mcp"
20
21
  s.add_development_dependency "rake"
21
22
  s.add_development_dependency "rspec"
22
23
  s.add_development_dependency "rufo"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-pg-extras
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.6.10
4
+ version: 6.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - pawurb
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-05-07 00:00:00.000000000 Z
11
+ date: 2025-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-pg-extras
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 5.6.10
19
+ version: 6.0.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 5.6.10
26
+ version: 6.0.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rails
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: fast-mcp
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -116,6 +130,7 @@ files:
116
130
  - lib/rails_pg_extras/diagnose_print.rb
117
131
  - lib/rails_pg_extras/index_info.rb
118
132
  - lib/rails_pg_extras/index_info_print.rb
133
+ - lib/rails_pg_extras/mcp_app.rb
119
134
  - lib/rails_pg_extras/missing_fk_constraints.rb
120
135
  - lib/rails_pg_extras/missing_fk_indexes.rb
121
136
  - lib/rails_pg_extras/railtie.rb
@@ -126,6 +141,7 @@ files:
126
141
  - lib/rails_pg_extras/web.rb
127
142
  - lib/rails_pg_extras/web/engine.rb
128
143
  - marginalia-logs.png
144
+ - pg-extras-mcp.png
129
145
  - pg-extras-ui-3.png
130
146
  - rails-pg-extras-diagnose.png
131
147
  - rails-pg-extras.gemspec