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 +4 -4
- data/.github/workflows/ci.yml +1 -1
- data/README.md +37 -0
- data/app/views/rails_pg_extras/web/queries/show.html.erb +2 -4
- data/app/views/rails_pg_extras/web/shared/_queries_selector.html.erb +4 -4
- data/lib/rails-pg-extras.rb +5 -0
- data/lib/rails_pg_extras/mcp_app.rb +107 -0
- data/lib/rails_pg_extras/version.rb +1 -1
- data/pg-extras-mcp.png +0 -0
- data/rails-pg-extras.gemspec +1 -0
- metadata +20 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0eb7080dab805a854ce746d67d42ea84e7b315587ea49a952ecafaaa9bc7a3b7
|
4
|
+
data.tar.gz: 82004fbeae8c56a47a52bf7ed3880af1c7408fb6a5fdf4fa8acfc91b9261d8e0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8648efd4fb3f4f53bae5aa397e8aba53341846c7f6af3597c3c1fe66ca4af7f2bd92117014449cb25295ce57b96dadc7defcd2d09e6eff41aa646bb95efb7ed9
|
7
|
+
data.tar.gz: 40261d23146c0d9dc0a0c09ca24b980bcc731e6b3199b20825a95208f14519935224d00a626995dea2b2039aaafe4ac671ed4e03acc485cf9d6700995a66f26a
|
data/.github/workflows/ci.yml
CHANGED
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
|
+

|
187
|
+
|
151
188
|
## Available methods
|
152
189
|
|
153
190
|
### `measure_queries`
|
@@ -3,10 +3,8 @@
|
|
3
3
|
|
4
4
|
<br>
|
5
5
|
|
6
|
-
<%=
|
7
|
-
|
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) => {
|
data/lib/rails-pg-extras.rb
CHANGED
@@ -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
|
data/pg-extras-mcp.png
ADDED
Binary file
|
data/rails-pg-extras.gemspec
CHANGED
@@ -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:
|
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-
|
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:
|
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:
|
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
|