@tejasanik/postgres-mcp-server 1.0.0 → 1.1.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.
- package/README.md +63 -10
- package/dist/__tests__/analysis-tools.test.d.ts +2 -0
- package/dist/__tests__/analysis-tools.test.d.ts.map +1 -0
- package/dist/__tests__/analysis-tools.test.js +294 -0
- package/dist/__tests__/analysis-tools.test.js.map +1 -0
- package/dist/__tests__/db-manager.test.d.ts +2 -0
- package/dist/__tests__/db-manager.test.d.ts.map +1 -0
- package/dist/__tests__/db-manager.test.js +243 -0
- package/dist/__tests__/db-manager.test.js.map +1 -0
- package/dist/__tests__/mcp-server.test.d.ts +13 -0
- package/dist/__tests__/mcp-server.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-server.test.js +131 -0
- package/dist/__tests__/mcp-server.test.js.map +1 -0
- package/dist/__tests__/schema-tools.test.d.ts +2 -0
- package/dist/__tests__/schema-tools.test.d.ts.map +1 -0
- package/dist/__tests__/schema-tools.test.js +171 -0
- package/dist/__tests__/schema-tools.test.js.map +1 -0
- package/dist/__tests__/server-tools.test.d.ts +2 -0
- package/dist/__tests__/server-tools.test.d.ts.map +1 -0
- package/dist/__tests__/server-tools.test.js +94 -0
- package/dist/__tests__/server-tools.test.js.map +1 -0
- package/dist/__tests__/sql-tools.test.d.ts +2 -0
- package/dist/__tests__/sql-tools.test.d.ts.map +1 -0
- package/dist/__tests__/sql-tools.test.js +235 -0
- package/dist/__tests__/sql-tools.test.js.map +1 -0
- package/dist/__tests__/validation.test.d.ts +2 -0
- package/dist/__tests__/validation.test.d.ts.map +1 -0
- package/dist/__tests__/validation.test.js +203 -0
- package/dist/__tests__/validation.test.js.map +1 -0
- package/dist/db-manager.d.ts +17 -4
- package/dist/db-manager.d.ts.map +1 -1
- package/dist/db-manager.js +143 -26
- package/dist/db-manager.js.map +1 -1
- package/dist/index.js +62 -26
- package/dist/index.js.map +1 -1
- package/dist/tools/analysis-tools.d.ts +1 -0
- package/dist/tools/analysis-tools.d.ts.map +1 -1
- package/dist/tools/analysis-tools.js +158 -81
- package/dist/tools/analysis-tools.js.map +1 -1
- package/dist/tools/index.js +4 -20
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/schema-tools.d.ts.map +1 -1
- package/dist/tools/schema-tools.js +71 -40
- package/dist/tools/schema-tools.js.map +1 -1
- package/dist/tools/server-tools.d.ts +11 -1
- package/dist/tools/server-tools.d.ts.map +1 -1
- package/dist/tools/server-tools.js +23 -14
- package/dist/tools/server-tools.js.map +1 -1
- package/dist/tools/sql-tools.d.ts.map +1 -1
- package/dist/tools/sql-tools.js +88 -61
- package/dist/tools/sql-tools.js.map +1 -1
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -2
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/validation.d.ts +27 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +133 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +8 -2
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
exports.getObjectDetails = getObjectDetails;
|
|
6
|
-
const db_manager_js_1 = require("../db-manager.js");
|
|
7
|
-
async function listSchemas(args) {
|
|
8
|
-
const dbManager = (0, db_manager_js_1.getDbManager)();
|
|
1
|
+
import { getDbManager } from '../db-manager.js';
|
|
2
|
+
import { validateIdentifier } from '../utils/validation.js';
|
|
3
|
+
export async function listSchemas(args) {
|
|
4
|
+
const dbManager = getDbManager();
|
|
9
5
|
let query = `
|
|
10
6
|
SELECT
|
|
11
7
|
schema_name,
|
|
@@ -22,8 +18,25 @@ async function listSchemas(args) {
|
|
|
22
18
|
const result = await dbManager.query(query);
|
|
23
19
|
return result.rows;
|
|
24
20
|
}
|
|
25
|
-
async function listObjects(args) {
|
|
26
|
-
|
|
21
|
+
export async function listObjects(args) {
|
|
22
|
+
// Validate required parameters
|
|
23
|
+
if (!args.schema) {
|
|
24
|
+
throw new Error('schema parameter is required');
|
|
25
|
+
}
|
|
26
|
+
// Validate schema name to prevent SQL injection
|
|
27
|
+
validateIdentifier(args.schema, 'schema');
|
|
28
|
+
// Validate filter if provided
|
|
29
|
+
if (args.filter) {
|
|
30
|
+
// Allow more characters in filter since it's used with ILIKE and parameterized
|
|
31
|
+
if (args.filter.length > 128) {
|
|
32
|
+
throw new Error('filter must be 128 characters or less');
|
|
33
|
+
}
|
|
34
|
+
// Only allow safe characters in filter
|
|
35
|
+
if (!/^[a-zA-Z0-9_% ]+$/.test(args.filter)) {
|
|
36
|
+
throw new Error('filter contains invalid characters');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const dbManager = getDbManager();
|
|
27
40
|
const objectType = args.objectType || 'all';
|
|
28
41
|
const objects = [];
|
|
29
42
|
// List tables
|
|
@@ -47,14 +60,16 @@ async function listObjects(args) {
|
|
|
47
60
|
if (objectType === 'all' || objectType === 'view') {
|
|
48
61
|
const viewsQuery = `
|
|
49
62
|
SELECT
|
|
50
|
-
table_name as name,
|
|
63
|
+
v.table_name as name,
|
|
51
64
|
'view' as type,
|
|
52
|
-
table_schema as schema,
|
|
53
|
-
'' as owner
|
|
54
|
-
FROM information_schema.views
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
65
|
+
v.table_schema as schema,
|
|
66
|
+
COALESCE(c.relowner::regrole::text, '') as owner
|
|
67
|
+
FROM information_schema.views v
|
|
68
|
+
LEFT JOIN pg_class c ON c.relname = v.table_name
|
|
69
|
+
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace AND n.nspname = v.table_schema
|
|
70
|
+
WHERE v.table_schema = $1
|
|
71
|
+
${args.filter ? "AND v.table_name ILIKE '%' || $2 || '%'" : ''}
|
|
72
|
+
ORDER BY v.table_name
|
|
58
73
|
`;
|
|
59
74
|
const params = args.filter ? [args.schema, args.filter] : [args.schema];
|
|
60
75
|
const views = await dbManager.query(viewsQuery, params);
|
|
@@ -64,14 +79,16 @@ async function listObjects(args) {
|
|
|
64
79
|
if (objectType === 'all' || objectType === 'sequence') {
|
|
65
80
|
const sequencesQuery = `
|
|
66
81
|
SELECT
|
|
67
|
-
sequence_name as name,
|
|
82
|
+
s.sequence_name as name,
|
|
68
83
|
'sequence' as type,
|
|
69
|
-
sequence_schema as schema,
|
|
70
|
-
'' as owner
|
|
71
|
-
FROM information_schema.sequences
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
84
|
+
s.sequence_schema as schema,
|
|
85
|
+
COALESCE(c.relowner::regrole::text, '') as owner
|
|
86
|
+
FROM information_schema.sequences s
|
|
87
|
+
LEFT JOIN pg_class c ON c.relname = s.sequence_name
|
|
88
|
+
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace AND n.nspname = s.sequence_schema
|
|
89
|
+
WHERE s.sequence_schema = $1
|
|
90
|
+
${args.filter ? "AND s.sequence_name ILIKE '%' || $2 || '%'" : ''}
|
|
91
|
+
ORDER BY s.sequence_name
|
|
75
92
|
`;
|
|
76
93
|
const params = args.filter ? [args.schema, args.filter] : [args.schema];
|
|
77
94
|
const sequences = await dbManager.query(sequencesQuery, params);
|
|
@@ -84,7 +101,7 @@ async function listObjects(args) {
|
|
|
84
101
|
extname as name,
|
|
85
102
|
'extension' as type,
|
|
86
103
|
n.nspname as schema,
|
|
87
|
-
'' as owner
|
|
104
|
+
COALESCE(extowner::regrole::text, '') as owner
|
|
88
105
|
FROM pg_extension e
|
|
89
106
|
JOIN pg_namespace n ON e.extnamespace = n.oid
|
|
90
107
|
WHERE n.nspname = $1
|
|
@@ -97,10 +114,20 @@ async function listObjects(args) {
|
|
|
97
114
|
}
|
|
98
115
|
return objects;
|
|
99
116
|
}
|
|
100
|
-
async function getObjectDetails(args) {
|
|
101
|
-
|
|
117
|
+
export async function getObjectDetails(args) {
|
|
118
|
+
// Validate required parameters
|
|
119
|
+
if (!args.schema) {
|
|
120
|
+
throw new Error('schema parameter is required');
|
|
121
|
+
}
|
|
122
|
+
if (!args.objectName) {
|
|
123
|
+
throw new Error('objectName parameter is required');
|
|
124
|
+
}
|
|
125
|
+
// Validate identifiers to prevent SQL injection
|
|
126
|
+
validateIdentifier(args.schema, 'schema');
|
|
127
|
+
validateIdentifier(args.objectName, 'objectName');
|
|
128
|
+
const dbManager = getDbManager();
|
|
102
129
|
const result = {};
|
|
103
|
-
// Get columns
|
|
130
|
+
// Get columns - using parameterized query
|
|
104
131
|
const columnsQuery = `
|
|
105
132
|
SELECT
|
|
106
133
|
column_name,
|
|
@@ -114,7 +141,7 @@ async function getObjectDetails(args) {
|
|
|
114
141
|
`;
|
|
115
142
|
const columns = await dbManager.query(columnsQuery, [args.schema, args.objectName]);
|
|
116
143
|
result.columns = columns.rows;
|
|
117
|
-
// Get constraints
|
|
144
|
+
// Get constraints - using parameterized query
|
|
118
145
|
const constraintsQuery = `
|
|
119
146
|
SELECT
|
|
120
147
|
tc.constraint_name,
|
|
@@ -135,7 +162,7 @@ async function getObjectDetails(args) {
|
|
|
135
162
|
`;
|
|
136
163
|
const constraints = await dbManager.query(constraintsQuery, [args.schema, args.objectName]);
|
|
137
164
|
result.constraints = constraints.rows;
|
|
138
|
-
// Get indexes
|
|
165
|
+
// Get indexes - using parameterized query
|
|
139
166
|
const indexesQuery = `
|
|
140
167
|
SELECT
|
|
141
168
|
i.relname as index_name,
|
|
@@ -151,31 +178,35 @@ async function getObjectDetails(args) {
|
|
|
151
178
|
`;
|
|
152
179
|
const indexes = await dbManager.query(indexesQuery, [args.schema, args.objectName]);
|
|
153
180
|
result.indexes = indexes.rows;
|
|
154
|
-
// Get table size and row count
|
|
181
|
+
// Get table size and row count using safe approach
|
|
155
182
|
try {
|
|
156
183
|
const sizeQuery = `
|
|
157
184
|
SELECT
|
|
158
|
-
pg_size_pretty(pg_total_relation_size(
|
|
159
|
-
|
|
185
|
+
pg_size_pretty(pg_total_relation_size(c.oid)) as size,
|
|
186
|
+
c.reltuples::bigint as row_count
|
|
187
|
+
FROM pg_class c
|
|
188
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
189
|
+
WHERE n.nspname = $1 AND c.relname = $2
|
|
160
190
|
`;
|
|
161
|
-
const
|
|
162
|
-
const sizeResult = await dbManager.query(sizeQuery, [fullName]);
|
|
191
|
+
const sizeResult = await dbManager.query(sizeQuery, [args.schema, args.objectName]);
|
|
163
192
|
if (sizeResult.rows.length > 0) {
|
|
164
193
|
result.size = sizeResult.rows[0].size;
|
|
165
194
|
result.rowCount = sizeResult.rows[0].row_count;
|
|
166
195
|
}
|
|
167
196
|
}
|
|
168
197
|
catch (error) {
|
|
169
|
-
// Size query might fail for views
|
|
198
|
+
// Size query might fail for views or non-existent objects
|
|
170
199
|
}
|
|
171
|
-
// Get view definition if it's a view
|
|
200
|
+
// Get view definition if it's a view - using safe parameterized approach
|
|
172
201
|
if (args.objectType === 'view') {
|
|
173
202
|
try {
|
|
174
203
|
const viewDefQuery = `
|
|
175
|
-
SELECT pg_get_viewdef(
|
|
204
|
+
SELECT pg_get_viewdef(c.oid, true) as definition
|
|
205
|
+
FROM pg_class c
|
|
206
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
207
|
+
WHERE n.nspname = $1 AND c.relname = $2 AND c.relkind = 'v'
|
|
176
208
|
`;
|
|
177
|
-
const
|
|
178
|
-
const viewDef = await dbManager.query(viewDefQuery, [fullName]);
|
|
209
|
+
const viewDef = await dbManager.query(viewDefQuery, [args.schema, args.objectName]);
|
|
179
210
|
if (viewDef.rows.length > 0) {
|
|
180
211
|
result.definition = viewDef.rows[0].definition;
|
|
181
212
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-tools.js","sourceRoot":"","sources":["../../src/tools/schema-tools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema-tools.js","sourceRoot":"","sources":["../../src/tools/schema-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import { DatabaseInfo } from '../types.js';
|
|
1
|
+
import { DatabaseInfo, ConnectionInfo } from '../types.js';
|
|
2
2
|
interface ListServersResult {
|
|
3
3
|
servers: {
|
|
4
4
|
name: string;
|
|
5
5
|
host: string;
|
|
6
6
|
port: string;
|
|
7
7
|
isConnected: boolean;
|
|
8
|
+
isDefault: boolean;
|
|
9
|
+
defaultDatabase?: string;
|
|
10
|
+
defaultSchema?: string;
|
|
8
11
|
databases?: DatabaseInfo[];
|
|
9
12
|
}[];
|
|
10
13
|
currentServer: string | null;
|
|
11
14
|
currentDatabase: string | null;
|
|
15
|
+
currentSchema: string | null;
|
|
12
16
|
}
|
|
13
17
|
export declare function listServersAndDbs(args: {
|
|
14
18
|
filter?: string;
|
|
@@ -18,11 +22,17 @@ export declare function listServersAndDbs(args: {
|
|
|
18
22
|
export declare function switchServerDb(args: {
|
|
19
23
|
server: string;
|
|
20
24
|
database?: string;
|
|
25
|
+
schema?: string;
|
|
21
26
|
}): Promise<{
|
|
22
27
|
success: boolean;
|
|
23
28
|
message: string;
|
|
24
29
|
currentServer: string;
|
|
25
30
|
currentDatabase: string;
|
|
31
|
+
currentSchema: string;
|
|
26
32
|
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Gets the current connection details including server, database, schema, and access mode.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getCurrentConnection(): Promise<ConnectionInfo>;
|
|
27
37
|
export {};
|
|
28
38
|
//# sourceMappingURL=server-tools.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-tools.d.ts","sourceRoot":"","sources":["../../src/tools/server-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"server-tools.d.ts","sourceRoot":"","sources":["../../src/tools/server-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE3D,UAAU,iBAAiB;IACzB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,OAAO,CAAC;QACrB,SAAS,EAAE,OAAO,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;KAC5B,EAAE,CAAC;IACJ,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoE7B;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBxH;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,cAAc,CAAC,CAGpE"}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
exports.switchServerDb = switchServerDb;
|
|
5
|
-
const db_manager_js_1 = require("../db-manager.js");
|
|
6
|
-
async function listServersAndDbs(args) {
|
|
7
|
-
const dbManager = (0, db_manager_js_1.getDbManager)();
|
|
1
|
+
import { getDbManager } from '../db-manager.js';
|
|
2
|
+
export async function listServersAndDbs(args) {
|
|
3
|
+
const dbManager = getDbManager();
|
|
8
4
|
const serversConfig = dbManager.getServersConfig();
|
|
9
5
|
const currentState = dbManager.getCurrentState();
|
|
10
6
|
let serverNames = Object.keys(serversConfig);
|
|
@@ -15,6 +11,7 @@ async function listServersAndDbs(args) {
|
|
|
15
11
|
serversConfig[name].host.toLowerCase().includes(filterLower));
|
|
16
12
|
}
|
|
17
13
|
const servers = [];
|
|
14
|
+
const defaultServerName = dbManager.getDefaultServerName();
|
|
18
15
|
for (const name of serverNames) {
|
|
19
16
|
const config = serversConfig[name];
|
|
20
17
|
const isConnected = currentState.currentServer === name;
|
|
@@ -22,7 +19,10 @@ async function listServersAndDbs(args) {
|
|
|
22
19
|
name,
|
|
23
20
|
host: config.host,
|
|
24
21
|
port: config.port || '5432',
|
|
25
|
-
isConnected
|
|
22
|
+
isConnected,
|
|
23
|
+
isDefault: config.isDefault === true || name === defaultServerName,
|
|
24
|
+
defaultDatabase: config.defaultDatabase,
|
|
25
|
+
defaultSchema: config.defaultSchema
|
|
26
26
|
};
|
|
27
27
|
// Fetch databases only if requested and connected to this server
|
|
28
28
|
if (args.fetchDatabases && isConnected) {
|
|
@@ -49,23 +49,32 @@ async function listServersAndDbs(args) {
|
|
|
49
49
|
return {
|
|
50
50
|
servers,
|
|
51
51
|
currentServer: currentState.currentServer,
|
|
52
|
-
currentDatabase: currentState.currentDatabase
|
|
52
|
+
currentDatabase: currentState.currentDatabase,
|
|
53
|
+
currentSchema: currentState.currentSchema
|
|
53
54
|
};
|
|
54
55
|
}
|
|
55
|
-
async function switchServerDb(args) {
|
|
56
|
-
const dbManager =
|
|
56
|
+
export async function switchServerDb(args) {
|
|
57
|
+
const dbManager = getDbManager();
|
|
57
58
|
try {
|
|
58
|
-
await dbManager.switchServer(args.server, args.database);
|
|
59
|
+
await dbManager.switchServer(args.server, args.database, args.schema);
|
|
59
60
|
const state = dbManager.getCurrentState();
|
|
60
61
|
return {
|
|
61
62
|
success: true,
|
|
62
|
-
message: `Successfully connected to server '${args.server}'${args.database ?
|
|
63
|
+
message: `Successfully connected to server '${args.server}'${args.database ? `, database '${args.database}'` : ''}${args.schema ? `, schema '${args.schema}'` : ''}`,
|
|
63
64
|
currentServer: state.currentServer,
|
|
64
|
-
currentDatabase: state.currentDatabase
|
|
65
|
+
currentDatabase: state.currentDatabase,
|
|
66
|
+
currentSchema: state.currentSchema
|
|
65
67
|
};
|
|
66
68
|
}
|
|
67
69
|
catch (error) {
|
|
68
70
|
throw new Error(`Failed to switch: ${error}`);
|
|
69
71
|
}
|
|
70
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Gets the current connection details including server, database, schema, and access mode.
|
|
75
|
+
*/
|
|
76
|
+
export async function getCurrentConnection() {
|
|
77
|
+
const dbManager = getDbManager();
|
|
78
|
+
return dbManager.getConnectionInfo();
|
|
79
|
+
}
|
|
71
80
|
//# sourceMappingURL=server-tools.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-tools.js","sourceRoot":"","sources":["../../src/tools/server-tools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server-tools.js","sourceRoot":"","sources":["../../src/tools/server-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-tools.d.ts","sourceRoot":"","sources":["../../src/tools/sql-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"sql-tools.d.ts","sourceRoot":"","sources":["../../src/tools/sql-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAW1D,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmD5B;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IAC1C,mBAAmB,CAAC,EAAE,KAAK,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACJ,GAAG,OAAO,CAAC,SAAS,CAAC,CA8HrB"}
|
package/dist/tools/sql-tools.js
CHANGED
|
@@ -1,68 +1,40 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.executeSql = executeSql;
|
|
37
|
-
exports.explainQuery = explainQuery;
|
|
38
|
-
const db_manager_js_1 = require("../db-manager.js");
|
|
39
|
-
const fs = __importStar(require("fs"));
|
|
40
|
-
const path = __importStar(require("path"));
|
|
41
|
-
const os = __importStar(require("os"));
|
|
42
|
-
const uuid_1 = require("uuid");
|
|
1
|
+
import { getDbManager } from '../db-manager.js';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as os from 'os';
|
|
5
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
6
|
+
import { validateIdentifier, validateIndexType, isReadOnlySql, validatePositiveInteger } from '../utils/validation.js';
|
|
43
7
|
const MAX_OUTPUT_CHARS = 50000; // Maximum characters before writing to file
|
|
44
8
|
const MAX_ROWS_IN_RESPONSE = 1000; // Maximum rows to include in direct response
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
9
|
+
const MAX_SQL_LENGTH = 100000; // Maximum SQL query length
|
|
10
|
+
export async function executeSql(args) {
|
|
11
|
+
// Validate SQL input
|
|
12
|
+
if (!args.sql || typeof args.sql !== 'string') {
|
|
13
|
+
throw new Error('sql parameter is required and must be a string');
|
|
14
|
+
}
|
|
15
|
+
if (args.sql.length > MAX_SQL_LENGTH) {
|
|
16
|
+
throw new Error(`SQL query exceeds maximum length of ${MAX_SQL_LENGTH} characters`);
|
|
17
|
+
}
|
|
18
|
+
const dbManager = getDbManager();
|
|
19
|
+
const maxRows = validatePositiveInteger(args.maxRows, 'maxRows', 1, 100000) || MAX_ROWS_IN_RESPONSE;
|
|
48
20
|
const result = await dbManager.query(args.sql);
|
|
49
21
|
const fields = result.fields?.map(f => f.name) || [];
|
|
50
22
|
const totalRows = result.rows.length;
|
|
51
|
-
//
|
|
52
|
-
const
|
|
53
|
-
if (
|
|
23
|
+
// Check if output is too large - estimate size first without full serialization
|
|
24
|
+
const estimatedSize = totalRows * (fields.length * 50); // rough estimate
|
|
25
|
+
if (estimatedSize > MAX_OUTPUT_CHARS || totalRows > maxRows) {
|
|
54
26
|
// Write to temp file
|
|
55
27
|
const tempDir = os.tmpdir();
|
|
56
|
-
const fileName = `postgres-mcp-output-${(
|
|
28
|
+
const fileName = `postgres-mcp-output-${uuidv4()}.json`;
|
|
57
29
|
const filePath = path.join(tempDir, fileName);
|
|
58
30
|
const outputData = {
|
|
59
31
|
totalRows,
|
|
60
32
|
fields,
|
|
61
33
|
rows: result.rows,
|
|
62
34
|
generatedAt: new Date().toISOString(),
|
|
63
|
-
query
|
|
35
|
+
// Don't include the query in output file for security
|
|
64
36
|
};
|
|
65
|
-
fs.writeFileSync(filePath, JSON.stringify(outputData, null, 2));
|
|
37
|
+
fs.writeFileSync(filePath, JSON.stringify(outputData, null, 2), { mode: 0o600 });
|
|
66
38
|
return {
|
|
67
39
|
rows: [],
|
|
68
40
|
rowCount: totalRows,
|
|
@@ -77,12 +49,30 @@ async function executeSql(args) {
|
|
|
77
49
|
fields
|
|
78
50
|
};
|
|
79
51
|
}
|
|
80
|
-
async function explainQuery(args) {
|
|
81
|
-
|
|
52
|
+
export async function explainQuery(args) {
|
|
53
|
+
// Validate SQL input
|
|
54
|
+
if (!args.sql || typeof args.sql !== 'string') {
|
|
55
|
+
throw new Error('sql parameter is required and must be a string');
|
|
56
|
+
}
|
|
57
|
+
if (args.sql.length > MAX_SQL_LENGTH) {
|
|
58
|
+
throw new Error(`SQL query exceeds maximum length of ${MAX_SQL_LENGTH} characters`);
|
|
59
|
+
}
|
|
60
|
+
// SECURITY: Block EXPLAIN ANALYZE on write queries to prevent bypassing read-only mode
|
|
61
|
+
if (args.analyze) {
|
|
62
|
+
const { isReadOnly, reason } = isReadOnlySql(args.sql);
|
|
63
|
+
if (!isReadOnly) {
|
|
64
|
+
throw new Error(`EXPLAIN ANALYZE is not allowed for write queries. ${reason}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const dbManager = getDbManager();
|
|
82
68
|
const client = await dbManager.getClient();
|
|
83
69
|
try {
|
|
84
|
-
// If hypothetical indexes are specified, create them
|
|
70
|
+
// If hypothetical indexes are specified, validate and create them
|
|
85
71
|
if (args.hypotheticalIndexes && args.hypotheticalIndexes.length > 0) {
|
|
72
|
+
// Limit number of hypothetical indexes
|
|
73
|
+
if (args.hypotheticalIndexes.length > 10) {
|
|
74
|
+
throw new Error('Maximum 10 hypothetical indexes allowed');
|
|
75
|
+
}
|
|
86
76
|
// Check if hypopg extension is available
|
|
87
77
|
const hypopgCheck = await client.query(`
|
|
88
78
|
SELECT EXISTS (
|
|
@@ -90,16 +80,51 @@ async function explainQuery(args) {
|
|
|
90
80
|
) as has_hypopg
|
|
91
81
|
`);
|
|
92
82
|
if (hypopgCheck.rows[0].has_hypopg) {
|
|
93
|
-
// Create hypothetical indexes
|
|
83
|
+
// Create hypothetical indexes with validated inputs
|
|
94
84
|
for (const idx of args.hypotheticalIndexes) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
85
|
+
// Validate table name
|
|
86
|
+
if (!idx.table) {
|
|
87
|
+
throw new Error('hypotheticalIndexes: table is required');
|
|
88
|
+
}
|
|
89
|
+
// Handle schema.table format
|
|
90
|
+
let schemaName = 'public';
|
|
91
|
+
let tableName = idx.table;
|
|
92
|
+
if (idx.table.includes('.')) {
|
|
93
|
+
const parts = idx.table.split('.');
|
|
94
|
+
if (parts.length !== 2) {
|
|
95
|
+
throw new Error(`hypotheticalIndexes: invalid table format '${idx.table}'`);
|
|
96
|
+
}
|
|
97
|
+
schemaName = parts[0];
|
|
98
|
+
tableName = parts[1];
|
|
99
|
+
validateIdentifier(schemaName, 'schema');
|
|
100
|
+
}
|
|
101
|
+
validateIdentifier(tableName, 'table');
|
|
102
|
+
// Validate columns
|
|
103
|
+
if (!idx.columns || !Array.isArray(idx.columns) || idx.columns.length === 0) {
|
|
104
|
+
throw new Error('hypotheticalIndexes: columns array is required and must not be empty');
|
|
105
|
+
}
|
|
106
|
+
if (idx.columns.length > 32) {
|
|
107
|
+
throw new Error('hypotheticalIndexes: maximum 32 columns per index');
|
|
108
|
+
}
|
|
109
|
+
for (const col of idx.columns) {
|
|
110
|
+
validateIdentifier(col, 'column');
|
|
111
|
+
}
|
|
112
|
+
// Validate index type
|
|
113
|
+
const indexType = validateIndexType(idx.indexType || 'btree');
|
|
114
|
+
// Build safe index creation string
|
|
115
|
+
const safeTableName = schemaName !== 'public'
|
|
116
|
+
? `"${schemaName}"."${tableName}"`
|
|
117
|
+
: `"${tableName}"`;
|
|
118
|
+
const safeColumns = idx.columns.map(c => `"${c}"`).join(', ');
|
|
119
|
+
// Use parameterized approach via hypopg
|
|
120
|
+
const indexDef = `CREATE INDEX ON ${safeTableName} USING ${indexType} (${safeColumns})`;
|
|
121
|
+
await client.query('SELECT hypopg_create_index($1)', [indexDef]);
|
|
98
122
|
}
|
|
99
123
|
}
|
|
100
124
|
}
|
|
101
125
|
// Build EXPLAIN query
|
|
102
|
-
const
|
|
126
|
+
const validFormats = ['text', 'json', 'yaml', 'xml'];
|
|
127
|
+
const format = validFormats.includes(args.format || '') ? args.format : 'json';
|
|
103
128
|
const options = [`FORMAT ${format.toUpperCase()}`];
|
|
104
129
|
if (args.analyze) {
|
|
105
130
|
options.push('ANALYZE');
|
|
@@ -107,8 +132,10 @@ async function explainQuery(args) {
|
|
|
107
132
|
if (args.buffers) {
|
|
108
133
|
options.push('BUFFERS');
|
|
109
134
|
}
|
|
110
|
-
|
|
111
|
-
|
|
135
|
+
// Use the validated SQL - it will be checked by the db-manager's read-only check
|
|
136
|
+
// EXPLAIN itself is read-only, EXPLAIN ANALYZE executes but we validated above
|
|
137
|
+
const explainSql = `EXPLAIN (${options.join(', ')}) ${args.sql}`;
|
|
138
|
+
const result = await client.query(explainSql);
|
|
112
139
|
// Clean up hypothetical indexes if created
|
|
113
140
|
if (args.hypotheticalIndexes && args.hypotheticalIndexes.length > 0) {
|
|
114
141
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-tools.js","sourceRoot":"","sources":["../../src/tools/sql-tools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sql-tools.js","sourceRoot":"","sources":["../../src/tools/sql-tools.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -3,6 +3,9 @@ export interface ServerConfig {
|
|
|
3
3
|
port: string;
|
|
4
4
|
username: string;
|
|
5
5
|
password: string;
|
|
6
|
+
defaultDatabase?: string;
|
|
7
|
+
defaultSchema?: string;
|
|
8
|
+
isDefault?: boolean;
|
|
6
9
|
}
|
|
7
10
|
export interface ServersConfig {
|
|
8
11
|
[serverName: string]: ServerConfig;
|
|
@@ -10,6 +13,16 @@ export interface ServersConfig {
|
|
|
10
13
|
export interface ConnectionState {
|
|
11
14
|
currentServer: string | null;
|
|
12
15
|
currentDatabase: string | null;
|
|
16
|
+
currentSchema: string | null;
|
|
17
|
+
}
|
|
18
|
+
export interface ConnectionInfo {
|
|
19
|
+
isConnected: boolean;
|
|
20
|
+
server: string | null;
|
|
21
|
+
database: string | null;
|
|
22
|
+
schema: string | null;
|
|
23
|
+
host: string | null;
|
|
24
|
+
port: string | null;
|
|
25
|
+
accessMode: 'full' | 'readonly';
|
|
13
26
|
}
|
|
14
27
|
export interface DatabaseInfo {
|
|
15
28
|
name: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|