@tejasanik/postgres-mcp-server 1.0.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/LICENSE +21 -0
- package/README.md +237 -0
- package/dist/db-manager.d.ts +25 -0
- package/dist/db-manager.d.ts.map +1 -0
- package/dist/db-manager.js +148 -0
- package/dist/db-manager.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +358 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/analysis-tools.d.ts +24 -0
- package/dist/tools/analysis-tools.d.ts.map +1 -0
- package/dist/tools/analysis-tools.js +449 -0
- package/dist/tools/analysis-tools.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +21 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/schema-tools.d.ts +22 -0
- package/dist/tools/schema-tools.d.ts.map +1 -0
- package/dist/tools/schema-tools.js +189 -0
- package/dist/tools/schema-tools.js.map +1 -0
- package/dist/tools/server-tools.d.ts +28 -0
- package/dist/tools/server-tools.d.ts.map +1 -0
- package/dist/tools/server-tools.js +71 -0
- package/dist/tools/server-tools.js.map +1 -0
- package/dist/tools/sql-tools.d.ts +17 -0
- package/dist/tools/sql-tools.d.ts.map +1 -0
- package/dist/tools/sql-tools.js +134 -0
- package/dist/tools/sql-tools.js.map +1 -0
- package/dist/types.d.ts +83 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listSchemas = listSchemas;
|
|
4
|
+
exports.listObjects = listObjects;
|
|
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)();
|
|
9
|
+
let query = `
|
|
10
|
+
SELECT
|
|
11
|
+
schema_name,
|
|
12
|
+
schema_owner as owner
|
|
13
|
+
FROM information_schema.schemata
|
|
14
|
+
`;
|
|
15
|
+
if (!args.includeSystemSchemas) {
|
|
16
|
+
query += `
|
|
17
|
+
WHERE schema_name NOT IN ('pg_catalog', 'information_schema', 'pg_toast', 'pg_temp_1', 'pg_toast_temp_1')
|
|
18
|
+
AND schema_name NOT LIKE 'pg_%'
|
|
19
|
+
`;
|
|
20
|
+
}
|
|
21
|
+
query += ' ORDER BY schema_name';
|
|
22
|
+
const result = await dbManager.query(query);
|
|
23
|
+
return result.rows;
|
|
24
|
+
}
|
|
25
|
+
async function listObjects(args) {
|
|
26
|
+
const dbManager = (0, db_manager_js_1.getDbManager)();
|
|
27
|
+
const objectType = args.objectType || 'all';
|
|
28
|
+
const objects = [];
|
|
29
|
+
// List tables
|
|
30
|
+
if (objectType === 'all' || objectType === 'table') {
|
|
31
|
+
const tablesQuery = `
|
|
32
|
+
SELECT
|
|
33
|
+
table_name as name,
|
|
34
|
+
'table' as type,
|
|
35
|
+
tableowner as owner,
|
|
36
|
+
schemaname as schema
|
|
37
|
+
FROM pg_catalog.pg_tables
|
|
38
|
+
WHERE schemaname = $1
|
|
39
|
+
${args.filter ? "AND table_name ILIKE '%' || $2 || '%'" : ''}
|
|
40
|
+
ORDER BY table_name
|
|
41
|
+
`;
|
|
42
|
+
const params = args.filter ? [args.schema, args.filter] : [args.schema];
|
|
43
|
+
const tables = await dbManager.query(tablesQuery, params);
|
|
44
|
+
objects.push(...tables.rows);
|
|
45
|
+
}
|
|
46
|
+
// List views
|
|
47
|
+
if (objectType === 'all' || objectType === 'view') {
|
|
48
|
+
const viewsQuery = `
|
|
49
|
+
SELECT
|
|
50
|
+
table_name as name,
|
|
51
|
+
'view' as type,
|
|
52
|
+
table_schema as schema,
|
|
53
|
+
'' as owner
|
|
54
|
+
FROM information_schema.views
|
|
55
|
+
WHERE table_schema = $1
|
|
56
|
+
${args.filter ? "AND table_name ILIKE '%' || $2 || '%'" : ''}
|
|
57
|
+
ORDER BY table_name
|
|
58
|
+
`;
|
|
59
|
+
const params = args.filter ? [args.schema, args.filter] : [args.schema];
|
|
60
|
+
const views = await dbManager.query(viewsQuery, params);
|
|
61
|
+
objects.push(...views.rows);
|
|
62
|
+
}
|
|
63
|
+
// List sequences
|
|
64
|
+
if (objectType === 'all' || objectType === 'sequence') {
|
|
65
|
+
const sequencesQuery = `
|
|
66
|
+
SELECT
|
|
67
|
+
sequence_name as name,
|
|
68
|
+
'sequence' as type,
|
|
69
|
+
sequence_schema as schema,
|
|
70
|
+
'' as owner
|
|
71
|
+
FROM information_schema.sequences
|
|
72
|
+
WHERE sequence_schema = $1
|
|
73
|
+
${args.filter ? "AND sequence_name ILIKE '%' || $2 || '%'" : ''}
|
|
74
|
+
ORDER BY sequence_name
|
|
75
|
+
`;
|
|
76
|
+
const params = args.filter ? [args.schema, args.filter] : [args.schema];
|
|
77
|
+
const sequences = await dbManager.query(sequencesQuery, params);
|
|
78
|
+
objects.push(...sequences.rows);
|
|
79
|
+
}
|
|
80
|
+
// List extensions (schema-independent but we can filter)
|
|
81
|
+
if (objectType === 'all' || objectType === 'extension') {
|
|
82
|
+
const extensionsQuery = `
|
|
83
|
+
SELECT
|
|
84
|
+
extname as name,
|
|
85
|
+
'extension' as type,
|
|
86
|
+
n.nspname as schema,
|
|
87
|
+
'' as owner
|
|
88
|
+
FROM pg_extension e
|
|
89
|
+
JOIN pg_namespace n ON e.extnamespace = n.oid
|
|
90
|
+
WHERE n.nspname = $1
|
|
91
|
+
${args.filter ? "AND extname ILIKE '%' || $2 || '%'" : ''}
|
|
92
|
+
ORDER BY extname
|
|
93
|
+
`;
|
|
94
|
+
const params = args.filter ? [args.schema, args.filter] : [args.schema];
|
|
95
|
+
const extensions = await dbManager.query(extensionsQuery, params);
|
|
96
|
+
objects.push(...extensions.rows);
|
|
97
|
+
}
|
|
98
|
+
return objects;
|
|
99
|
+
}
|
|
100
|
+
async function getObjectDetails(args) {
|
|
101
|
+
const dbManager = (0, db_manager_js_1.getDbManager)();
|
|
102
|
+
const result = {};
|
|
103
|
+
// Get columns
|
|
104
|
+
const columnsQuery = `
|
|
105
|
+
SELECT
|
|
106
|
+
column_name,
|
|
107
|
+
data_type,
|
|
108
|
+
is_nullable,
|
|
109
|
+
column_default,
|
|
110
|
+
character_maximum_length
|
|
111
|
+
FROM information_schema.columns
|
|
112
|
+
WHERE table_schema = $1 AND table_name = $2
|
|
113
|
+
ORDER BY ordinal_position
|
|
114
|
+
`;
|
|
115
|
+
const columns = await dbManager.query(columnsQuery, [args.schema, args.objectName]);
|
|
116
|
+
result.columns = columns.rows;
|
|
117
|
+
// Get constraints
|
|
118
|
+
const constraintsQuery = `
|
|
119
|
+
SELECT
|
|
120
|
+
tc.constraint_name,
|
|
121
|
+
tc.constraint_type,
|
|
122
|
+
tc.table_name,
|
|
123
|
+
kcu.column_name,
|
|
124
|
+
ccu.table_name as foreign_table_name,
|
|
125
|
+
ccu.column_name as foreign_column_name
|
|
126
|
+
FROM information_schema.table_constraints tc
|
|
127
|
+
LEFT JOIN information_schema.key_column_usage kcu
|
|
128
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
129
|
+
AND tc.table_schema = kcu.table_schema
|
|
130
|
+
LEFT JOIN information_schema.constraint_column_usage ccu
|
|
131
|
+
ON tc.constraint_name = ccu.constraint_name
|
|
132
|
+
AND tc.table_schema = ccu.table_schema
|
|
133
|
+
WHERE tc.table_schema = $1 AND tc.table_name = $2
|
|
134
|
+
ORDER BY tc.constraint_type, tc.constraint_name
|
|
135
|
+
`;
|
|
136
|
+
const constraints = await dbManager.query(constraintsQuery, [args.schema, args.objectName]);
|
|
137
|
+
result.constraints = constraints.rows;
|
|
138
|
+
// Get indexes
|
|
139
|
+
const indexesQuery = `
|
|
140
|
+
SELECT
|
|
141
|
+
i.relname as index_name,
|
|
142
|
+
pg_get_indexdef(i.oid) as index_definition,
|
|
143
|
+
ix.indisunique as is_unique,
|
|
144
|
+
ix.indisprimary as is_primary
|
|
145
|
+
FROM pg_class t
|
|
146
|
+
JOIN pg_index ix ON t.oid = ix.indrelid
|
|
147
|
+
JOIN pg_class i ON i.oid = ix.indexrelid
|
|
148
|
+
JOIN pg_namespace n ON n.oid = t.relnamespace
|
|
149
|
+
WHERE n.nspname = $1 AND t.relname = $2
|
|
150
|
+
ORDER BY i.relname
|
|
151
|
+
`;
|
|
152
|
+
const indexes = await dbManager.query(indexesQuery, [args.schema, args.objectName]);
|
|
153
|
+
result.indexes = indexes.rows;
|
|
154
|
+
// Get table size and row count (approximate)
|
|
155
|
+
try {
|
|
156
|
+
const sizeQuery = `
|
|
157
|
+
SELECT
|
|
158
|
+
pg_size_pretty(pg_total_relation_size($1::regclass)) as size,
|
|
159
|
+
(SELECT reltuples::bigint FROM pg_class WHERE oid = $1::regclass) as row_count
|
|
160
|
+
`;
|
|
161
|
+
const fullName = `"${args.schema}"."${args.objectName}"`;
|
|
162
|
+
const sizeResult = await dbManager.query(sizeQuery, [fullName]);
|
|
163
|
+
if (sizeResult.rows.length > 0) {
|
|
164
|
+
result.size = sizeResult.rows[0].size;
|
|
165
|
+
result.rowCount = sizeResult.rows[0].row_count;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
// Size query might fail for views
|
|
170
|
+
}
|
|
171
|
+
// Get view definition if it's a view
|
|
172
|
+
if (args.objectType === 'view') {
|
|
173
|
+
try {
|
|
174
|
+
const viewDefQuery = `
|
|
175
|
+
SELECT pg_get_viewdef($1::regclass, true) as definition
|
|
176
|
+
`;
|
|
177
|
+
const fullName = `"${args.schema}"."${args.objectName}"`;
|
|
178
|
+
const viewDef = await dbManager.query(viewDefQuery, [fullName]);
|
|
179
|
+
if (viewDef.rows.length > 0) {
|
|
180
|
+
result.definition = viewDef.rows[0].definition;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
// Might fail if not a view
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return result;
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=schema-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-tools.js","sourceRoot":"","sources":["../../src/tools/schema-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DatabaseInfo } from '../types.js';
|
|
2
|
+
interface ListServersResult {
|
|
3
|
+
servers: {
|
|
4
|
+
name: string;
|
|
5
|
+
host: string;
|
|
6
|
+
port: string;
|
|
7
|
+
isConnected: boolean;
|
|
8
|
+
databases?: DatabaseInfo[];
|
|
9
|
+
}[];
|
|
10
|
+
currentServer: string | null;
|
|
11
|
+
currentDatabase: string | null;
|
|
12
|
+
}
|
|
13
|
+
export declare function listServersAndDbs(args: {
|
|
14
|
+
filter?: string;
|
|
15
|
+
includeSystemDbs?: boolean;
|
|
16
|
+
fetchDatabases?: boolean;
|
|
17
|
+
}): Promise<ListServersResult>;
|
|
18
|
+
export declare function switchServerDb(args: {
|
|
19
|
+
server: string;
|
|
20
|
+
database?: string;
|
|
21
|
+
}): Promise<{
|
|
22
|
+
success: boolean;
|
|
23
|
+
message: string;
|
|
24
|
+
currentServer: string;
|
|
25
|
+
currentDatabase: string;
|
|
26
|
+
}>;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=server-tools.d.ts.map
|
|
@@ -0,0 +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;AAE3C,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,CAAC,EAAE,YAAY,EAAE,CAAC;KAC5B,EAAE,CAAC;IACJ,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;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,CA8D7B;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBjG"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listServersAndDbs = listServersAndDbs;
|
|
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)();
|
|
8
|
+
const serversConfig = dbManager.getServersConfig();
|
|
9
|
+
const currentState = dbManager.getCurrentState();
|
|
10
|
+
let serverNames = Object.keys(serversConfig);
|
|
11
|
+
// Apply filter if provided
|
|
12
|
+
if (args.filter) {
|
|
13
|
+
const filterLower = args.filter.toLowerCase();
|
|
14
|
+
serverNames = serverNames.filter(name => name.toLowerCase().includes(filterLower) ||
|
|
15
|
+
serversConfig[name].host.toLowerCase().includes(filterLower));
|
|
16
|
+
}
|
|
17
|
+
const servers = [];
|
|
18
|
+
for (const name of serverNames) {
|
|
19
|
+
const config = serversConfig[name];
|
|
20
|
+
const isConnected = currentState.currentServer === name;
|
|
21
|
+
const serverInfo = {
|
|
22
|
+
name,
|
|
23
|
+
host: config.host,
|
|
24
|
+
port: config.port || '5432',
|
|
25
|
+
isConnected
|
|
26
|
+
};
|
|
27
|
+
// Fetch databases only if requested and connected to this server
|
|
28
|
+
if (args.fetchDatabases && isConnected) {
|
|
29
|
+
try {
|
|
30
|
+
let databases = await dbManager.listDatabases();
|
|
31
|
+
// Filter system databases unless explicitly included
|
|
32
|
+
if (!args.includeSystemDbs) {
|
|
33
|
+
const systemDbs = ['template0', 'template1'];
|
|
34
|
+
databases = databases.filter(db => !systemDbs.includes(db.name));
|
|
35
|
+
}
|
|
36
|
+
// Apply database filter
|
|
37
|
+
if (args.filter) {
|
|
38
|
+
const filterLower = args.filter.toLowerCase();
|
|
39
|
+
databases = databases.filter(db => db.name.toLowerCase().includes(filterLower));
|
|
40
|
+
}
|
|
41
|
+
serverInfo.databases = databases;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
// If we can't fetch databases, just skip
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
servers.push(serverInfo);
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
servers,
|
|
51
|
+
currentServer: currentState.currentServer,
|
|
52
|
+
currentDatabase: currentState.currentDatabase
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async function switchServerDb(args) {
|
|
56
|
+
const dbManager = (0, db_manager_js_1.getDbManager)();
|
|
57
|
+
try {
|
|
58
|
+
await dbManager.switchServer(args.server, args.database);
|
|
59
|
+
const state = dbManager.getCurrentState();
|
|
60
|
+
return {
|
|
61
|
+
success: true,
|
|
62
|
+
message: `Successfully connected to server '${args.server}'${args.database ? ` and database '${args.database}'` : ''}`,
|
|
63
|
+
currentServer: state.currentServer,
|
|
64
|
+
currentDatabase: state.currentDatabase
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw new Error(`Failed to switch: ${error}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=server-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-tools.js","sourceRoot":"","sources":["../../src/tools/server-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ExecuteSqlResult, QueryPlan } from '../types.js';
|
|
2
|
+
export declare function executeSql(args: {
|
|
3
|
+
sql: string;
|
|
4
|
+
maxRows?: number;
|
|
5
|
+
}): Promise<ExecuteSqlResult>;
|
|
6
|
+
export declare function explainQuery(args: {
|
|
7
|
+
sql: string;
|
|
8
|
+
analyze?: boolean;
|
|
9
|
+
buffers?: boolean;
|
|
10
|
+
format?: 'text' | 'json' | 'yaml' | 'xml';
|
|
11
|
+
hypotheticalIndexes?: Array<{
|
|
12
|
+
table: string;
|
|
13
|
+
columns: string[];
|
|
14
|
+
indexType?: string;
|
|
15
|
+
}>;
|
|
16
|
+
}): Promise<QueryPlan>;
|
|
17
|
+
//# sourceMappingURL=sql-tools.d.ts.map
|
|
@@ -0,0 +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;AAS1D,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0C5B;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,CA2DrB"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
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");
|
|
43
|
+
const MAX_OUTPUT_CHARS = 50000; // Maximum characters before writing to file
|
|
44
|
+
const MAX_ROWS_IN_RESPONSE = 1000; // Maximum rows to include in direct response
|
|
45
|
+
async function executeSql(args) {
|
|
46
|
+
const dbManager = (0, db_manager_js_1.getDbManager)();
|
|
47
|
+
const maxRows = args.maxRows || MAX_ROWS_IN_RESPONSE;
|
|
48
|
+
const result = await dbManager.query(args.sql);
|
|
49
|
+
const fields = result.fields?.map(f => f.name) || [];
|
|
50
|
+
const totalRows = result.rows.length;
|
|
51
|
+
// Serialize the result to check size
|
|
52
|
+
const serialized = JSON.stringify(result.rows, null, 2);
|
|
53
|
+
if (serialized.length > MAX_OUTPUT_CHARS || totalRows > maxRows) {
|
|
54
|
+
// Write to temp file
|
|
55
|
+
const tempDir = os.tmpdir();
|
|
56
|
+
const fileName = `postgres-mcp-output-${(0, uuid_1.v4)()}.json`;
|
|
57
|
+
const filePath = path.join(tempDir, fileName);
|
|
58
|
+
const outputData = {
|
|
59
|
+
totalRows,
|
|
60
|
+
fields,
|
|
61
|
+
rows: result.rows,
|
|
62
|
+
generatedAt: new Date().toISOString(),
|
|
63
|
+
query: args.sql
|
|
64
|
+
};
|
|
65
|
+
fs.writeFileSync(filePath, JSON.stringify(outputData, null, 2));
|
|
66
|
+
return {
|
|
67
|
+
rows: [],
|
|
68
|
+
rowCount: totalRows,
|
|
69
|
+
fields,
|
|
70
|
+
outputFile: filePath,
|
|
71
|
+
truncated: true
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
rows: result.rows,
|
|
76
|
+
rowCount: totalRows,
|
|
77
|
+
fields
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
async function explainQuery(args) {
|
|
81
|
+
const dbManager = (0, db_manager_js_1.getDbManager)();
|
|
82
|
+
const client = await dbManager.getClient();
|
|
83
|
+
try {
|
|
84
|
+
// If hypothetical indexes are specified, create them as hypothetical
|
|
85
|
+
if (args.hypotheticalIndexes && args.hypotheticalIndexes.length > 0) {
|
|
86
|
+
// Check if hypopg extension is available
|
|
87
|
+
const hypopgCheck = await client.query(`
|
|
88
|
+
SELECT EXISTS (
|
|
89
|
+
SELECT 1 FROM pg_extension WHERE extname = 'hypopg'
|
|
90
|
+
) as has_hypopg
|
|
91
|
+
`);
|
|
92
|
+
if (hypopgCheck.rows[0].has_hypopg) {
|
|
93
|
+
// Create hypothetical indexes
|
|
94
|
+
for (const idx of args.hypotheticalIndexes) {
|
|
95
|
+
const indexType = idx.indexType || 'btree';
|
|
96
|
+
const columns = idx.columns.join(', ');
|
|
97
|
+
await client.query(`SELECT hypopg_create_index('CREATE INDEX ON ${idx.table} USING ${indexType} (${columns})')`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Build EXPLAIN query
|
|
102
|
+
const format = args.format || 'json';
|
|
103
|
+
const options = [`FORMAT ${format.toUpperCase()}`];
|
|
104
|
+
if (args.analyze) {
|
|
105
|
+
options.push('ANALYZE');
|
|
106
|
+
}
|
|
107
|
+
if (args.buffers) {
|
|
108
|
+
options.push('BUFFERS');
|
|
109
|
+
}
|
|
110
|
+
const explainQuery = `EXPLAIN (${options.join(', ')}) ${args.sql}`;
|
|
111
|
+
const result = await client.query(explainQuery);
|
|
112
|
+
// Clean up hypothetical indexes if created
|
|
113
|
+
if (args.hypotheticalIndexes && args.hypotheticalIndexes.length > 0) {
|
|
114
|
+
try {
|
|
115
|
+
await client.query('SELECT hypopg_reset()');
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
// Ignore if hypopg not available
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (format === 'json') {
|
|
122
|
+
return {
|
|
123
|
+
plan: result.rows[0]['QUERY PLAN'][0]
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
plan: result.rows.map((r) => r['QUERY PLAN']).join('\n')
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
client.release();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=sql-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export interface ServerConfig {
|
|
2
|
+
host: string;
|
|
3
|
+
port: string;
|
|
4
|
+
username: string;
|
|
5
|
+
password: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ServersConfig {
|
|
8
|
+
[serverName: string]: ServerConfig;
|
|
9
|
+
}
|
|
10
|
+
export interface ConnectionState {
|
|
11
|
+
currentServer: string | null;
|
|
12
|
+
currentDatabase: string | null;
|
|
13
|
+
}
|
|
14
|
+
export interface DatabaseInfo {
|
|
15
|
+
name: string;
|
|
16
|
+
owner: string;
|
|
17
|
+
encoding: string;
|
|
18
|
+
size: string;
|
|
19
|
+
}
|
|
20
|
+
export interface SchemaInfo {
|
|
21
|
+
schema_name: string;
|
|
22
|
+
owner: string;
|
|
23
|
+
}
|
|
24
|
+
export interface TableInfo {
|
|
25
|
+
name: string;
|
|
26
|
+
type: 'table' | 'view' | 'sequence' | 'extension';
|
|
27
|
+
owner: string;
|
|
28
|
+
schema: string;
|
|
29
|
+
}
|
|
30
|
+
export interface ColumnInfo {
|
|
31
|
+
column_name: string;
|
|
32
|
+
data_type: string;
|
|
33
|
+
is_nullable: string;
|
|
34
|
+
column_default: string | null;
|
|
35
|
+
character_maximum_length: number | null;
|
|
36
|
+
}
|
|
37
|
+
export interface ConstraintInfo {
|
|
38
|
+
constraint_name: string;
|
|
39
|
+
constraint_type: string;
|
|
40
|
+
table_name: string;
|
|
41
|
+
column_name: string;
|
|
42
|
+
foreign_table_name: string | null;
|
|
43
|
+
foreign_column_name: string | null;
|
|
44
|
+
}
|
|
45
|
+
export interface IndexInfo {
|
|
46
|
+
index_name: string;
|
|
47
|
+
index_definition: string;
|
|
48
|
+
is_unique: boolean;
|
|
49
|
+
is_primary: boolean;
|
|
50
|
+
}
|
|
51
|
+
export interface QueryPlan {
|
|
52
|
+
plan: object | string;
|
|
53
|
+
planning_time?: number;
|
|
54
|
+
execution_time?: number;
|
|
55
|
+
}
|
|
56
|
+
export interface SlowQuery {
|
|
57
|
+
query: string;
|
|
58
|
+
calls: number;
|
|
59
|
+
total_time: number;
|
|
60
|
+
mean_time: number;
|
|
61
|
+
rows: number;
|
|
62
|
+
}
|
|
63
|
+
export interface IndexRecommendation {
|
|
64
|
+
table: string;
|
|
65
|
+
columns: string[];
|
|
66
|
+
index_type: string;
|
|
67
|
+
reason: string;
|
|
68
|
+
estimated_improvement: string;
|
|
69
|
+
}
|
|
70
|
+
export interface HealthCheckResult {
|
|
71
|
+
category: string;
|
|
72
|
+
status: 'healthy' | 'warning' | 'critical';
|
|
73
|
+
message: string;
|
|
74
|
+
details?: object;
|
|
75
|
+
}
|
|
76
|
+
export interface ExecuteSqlResult {
|
|
77
|
+
rows: any[];
|
|
78
|
+
rowCount: number;
|
|
79
|
+
fields: string[];
|
|
80
|
+
outputFile?: string;
|
|
81
|
+
truncated?: boolean;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +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;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,CAAC;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tejasanik/postgres-mcp-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A Model Context Protocol (MCP) server for PostgreSQL database management and analysis",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"postgres-mcp-server": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"start": "node dist/index.js",
|
|
13
|
+
"dev": "ts-node src/index.ts",
|
|
14
|
+
"prepare": "npm run build",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"mcp",
|
|
19
|
+
"postgres",
|
|
20
|
+
"postgresql",
|
|
21
|
+
"database",
|
|
22
|
+
"model-context-protocol",
|
|
23
|
+
"anthropic",
|
|
24
|
+
"claude"
|
|
25
|
+
],
|
|
26
|
+
"author": "",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
30
|
+
"pg": "^8.13.1",
|
|
31
|
+
"uuid": "^11.0.3"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "^22.10.2",
|
|
35
|
+
"@types/pg": "^8.11.10",
|
|
36
|
+
"@types/uuid": "^10.0.0",
|
|
37
|
+
"typescript": "^5.7.2"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18.0.0"
|
|
41
|
+
},
|
|
42
|
+
"files": [
|
|
43
|
+
"dist",
|
|
44
|
+
"README.md"
|
|
45
|
+
],
|
|
46
|
+
"repository": {
|
|
47
|
+
"type": "git",
|
|
48
|
+
"url": "git+https://github.com/Teja-sudo/postgres-mcp-server.git"
|
|
49
|
+
},
|
|
50
|
+
"publishConfig": {
|
|
51
|
+
"access": "public"
|
|
52
|
+
}
|
|
53
|
+
}
|