@tejasanik/postgres-mcp-server 1.5.0 → 1.6.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 +46 -13
- package/dist/__tests__/mcp-server.test.js +20 -5
- package/dist/__tests__/mcp-server.test.js.map +1 -1
- package/dist/__tests__/server-tools.test.js +38 -14
- package/dist/__tests__/server-tools.test.js.map +1 -1
- package/dist/index.js +259 -382
- package/dist/index.js.map +1 -1
- package/dist/tools/server-tools.d.ts +36 -17
- package/dist/tools/server-tools.d.ts.map +1 -1
- package/dist/tools/server-tools.js +93 -85
- package/dist/tools/server-tools.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -189,17 +189,37 @@ claude mcp add-json postgres_dbs --scope user '{
|
|
|
189
189
|
|
|
190
190
|
### Server & Database Management
|
|
191
191
|
|
|
192
|
-
#### `
|
|
192
|
+
#### `list_servers`
|
|
193
193
|
|
|
194
|
-
Lists all configured PostgreSQL servers and
|
|
194
|
+
Lists all configured PostgreSQL servers. Returns server names, hosts, ports, and connection status. Use this first to discover available servers.
|
|
195
195
|
|
|
196
196
|
**Parameters:**
|
|
197
197
|
|
|
198
|
-
- `
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
- `
|
|
198
|
+
- `filter` (optional): Filter servers by name or host (case-insensitive partial match)
|
|
199
|
+
|
|
200
|
+
**Returns:**
|
|
201
|
+
|
|
202
|
+
- `servers`: Array of server information (name, host, port, isConnected, isDefault)
|
|
203
|
+
- `currentServer`: Currently connected server name (or null)
|
|
204
|
+
- `currentDatabase`: Currently connected database (or null)
|
|
205
|
+
- `currentSchema`: Current schema (or null)
|
|
206
|
+
|
|
207
|
+
#### `list_databases`
|
|
208
|
+
|
|
209
|
+
Lists databases in a specific PostgreSQL server. Always provide the server name to avoid confusion.
|
|
210
|
+
|
|
211
|
+
**Parameters:**
|
|
212
|
+
|
|
213
|
+
- `serverName` (required): Name of the server to list databases from. Use `list_servers` to see available servers.
|
|
214
|
+
- `filter` (optional): Filter databases by name (case-insensitive partial match)
|
|
215
|
+
- `includeSystemDbs` (optional): Include system databases (template0, template1). Default: false
|
|
216
|
+
- `maxResults` (optional): Maximum number of databases to return (default: 50, max: 200)
|
|
217
|
+
|
|
218
|
+
**Returns:**
|
|
219
|
+
|
|
220
|
+
- `serverName`: The server name that was queried
|
|
221
|
+
- `databases`: Array of database information (name, owner, encoding, size)
|
|
222
|
+
- `currentDatabase`: Currently connected database on this server (or null)
|
|
203
223
|
|
|
204
224
|
#### `switch_server_db`
|
|
205
225
|
|
|
@@ -261,12 +281,25 @@ Provides detailed information about a database object including columns, constra
|
|
|
261
281
|
|
|
262
282
|
#### `execute_sql`
|
|
263
283
|
|
|
264
|
-
Executes SQL statements on the database. Read-only mode prevents write operations.
|
|
284
|
+
Executes SQL statements on the database. Supports pagination and parameterized queries. Read-only mode prevents write operations.
|
|
265
285
|
|
|
266
286
|
**Parameters:**
|
|
267
287
|
|
|
268
|
-
- `sql` (required): SQL statement to execute
|
|
269
|
-
- `
|
|
288
|
+
- `sql` (required): SQL statement to execute. Use `$1`, `$2`, etc. for parameterized queries.
|
|
289
|
+
- `params` (optional): Array of parameters for parameterized queries (e.g., `[123, "value"]`). Prevents SQL injection.
|
|
290
|
+
- `maxRows` (optional): Maximum rows to return (default: 1000, max: 100000). Use with `offset` for pagination.
|
|
291
|
+
- `offset` (optional): Number of rows to skip for pagination (default: 0).
|
|
292
|
+
- `allowLargeScript` (optional): Set to true to bypass the 100KB SQL length limit for deployment scripts.
|
|
293
|
+
|
|
294
|
+
**Returns:**
|
|
295
|
+
|
|
296
|
+
- `rows`: Result rows (paginated)
|
|
297
|
+
- `rowCount`: Total number of rows in the result
|
|
298
|
+
- `fields`: Column names
|
|
299
|
+
- `executionTimeMs`: Query execution time in milliseconds
|
|
300
|
+
- `offset`: Current offset
|
|
301
|
+
- `hasMore`: Whether more rows are available
|
|
302
|
+
- `outputFile`: (Only if output is too large) Path to temp file with full results
|
|
270
303
|
|
|
271
304
|
**Note:** Large outputs are automatically written to a temp file, and the file path is returned. This prevents token wastage when dealing with large result sets.
|
|
272
305
|
|
|
@@ -333,9 +366,9 @@ Performs comprehensive database health checks including:
|
|
|
333
366
|
### Connect to a Server and List Databases
|
|
334
367
|
|
|
335
368
|
```
|
|
336
|
-
1. Use
|
|
337
|
-
2. Use
|
|
338
|
-
3. Use
|
|
369
|
+
1. Use list_servers to see available servers
|
|
370
|
+
2. Use list_databases with serverName="dev" to see databases in the dev server
|
|
371
|
+
3. Use switch_server_db with server="dev", database="myapp" to connect
|
|
339
372
|
```
|
|
340
373
|
|
|
341
374
|
### Explore Database Schema
|
|
@@ -13,8 +13,10 @@ import { describe, it, expect, beforeEach, afterEach } from '@jest/globals';
|
|
|
13
13
|
describe('MCP Server Tool Definitions', () => {
|
|
14
14
|
describe('Tool Definitions', () => {
|
|
15
15
|
const expectedTools = [
|
|
16
|
-
'
|
|
16
|
+
'list_servers',
|
|
17
|
+
'list_databases',
|
|
17
18
|
'switch_server_db',
|
|
19
|
+
'get_current_connection',
|
|
18
20
|
'list_schemas',
|
|
19
21
|
'list_objects',
|
|
20
22
|
'get_object_details',
|
|
@@ -26,7 +28,7 @@ describe('MCP Server Tool Definitions', () => {
|
|
|
26
28
|
'analyze_db_health'
|
|
27
29
|
];
|
|
28
30
|
it('should define all expected tools', () => {
|
|
29
|
-
expect(expectedTools).toHaveLength(
|
|
31
|
+
expect(expectedTools).toHaveLength(13);
|
|
30
32
|
});
|
|
31
33
|
it('should have proper input schemas for required parameters', () => {
|
|
32
34
|
// Verify key tools have required parameters defined
|
|
@@ -87,18 +89,31 @@ describe('Environment Configuration', () => {
|
|
|
87
89
|
});
|
|
88
90
|
});
|
|
89
91
|
describe('Response Format Expectations', () => {
|
|
90
|
-
it('should expect
|
|
92
|
+
it('should expect list_servers response format', () => {
|
|
91
93
|
const expectedFormat = {
|
|
92
94
|
servers: [
|
|
93
|
-
{ name: 'string', host: 'string', port: 'string', isConnected: 'boolean' }
|
|
95
|
+
{ name: 'string', host: 'string', port: 'string', isConnected: 'boolean', isDefault: 'boolean' }
|
|
94
96
|
],
|
|
95
97
|
currentServer: 'string|null',
|
|
96
|
-
currentDatabase: 'string|null'
|
|
98
|
+
currentDatabase: 'string|null',
|
|
99
|
+
currentSchema: 'string|null'
|
|
97
100
|
};
|
|
98
101
|
expect(expectedFormat).toHaveProperty('servers');
|
|
99
102
|
expect(expectedFormat).toHaveProperty('currentServer');
|
|
100
103
|
expect(expectedFormat).toHaveProperty('currentDatabase');
|
|
101
104
|
});
|
|
105
|
+
it('should expect list_databases response format', () => {
|
|
106
|
+
const expectedFormat = {
|
|
107
|
+
serverName: 'string',
|
|
108
|
+
databases: [
|
|
109
|
+
{ name: 'string', owner: 'string', encoding: 'string', size: 'string' }
|
|
110
|
+
],
|
|
111
|
+
currentDatabase: 'string|null'
|
|
112
|
+
};
|
|
113
|
+
expect(expectedFormat).toHaveProperty('serverName');
|
|
114
|
+
expect(expectedFormat).toHaveProperty('databases');
|
|
115
|
+
expect(expectedFormat).toHaveProperty('currentDatabase');
|
|
116
|
+
});
|
|
102
117
|
it('should expect execute_sql response format', () => {
|
|
103
118
|
const smallResultFormat = {
|
|
104
119
|
rows: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.test.js","sourceRoot":"","sources":["../../src/__tests__/mcp-server.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE5E,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,MAAM,aAAa,GAAG;YACpB,
|
|
1
|
+
{"version":3,"file":"mcp-server.test.js","sourceRoot":"","sources":["../../src/__tests__/mcp-server.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach } from '@jest/globals';
|
|
2
|
-
import {
|
|
2
|
+
import { listServers, listDatabases, switchServerDb } from '../tools/server-tools.js';
|
|
3
3
|
import { resetDbManager } from '../db-manager.js';
|
|
4
4
|
describe('Server Tools', () => {
|
|
5
5
|
beforeEach(() => {
|
|
@@ -10,9 +10,9 @@ describe('Server Tools', () => {
|
|
|
10
10
|
afterEach(() => {
|
|
11
11
|
resetDbManager();
|
|
12
12
|
});
|
|
13
|
-
describe('
|
|
13
|
+
describe('listServers', () => {
|
|
14
14
|
it('should return empty list when no servers configured', async () => {
|
|
15
|
-
const result = await
|
|
15
|
+
const result = await listServers({});
|
|
16
16
|
expect(result.servers).toEqual([]);
|
|
17
17
|
expect(result.currentServer).toBeNull();
|
|
18
18
|
expect(result.currentDatabase).toBeNull();
|
|
@@ -23,11 +23,11 @@ describe('Server Tools', () => {
|
|
|
23
23
|
staging: { host: 'staging.example.com', port: '5432', username: 'user', password: 'pass' },
|
|
24
24
|
prod: { host: 'prod.example.com', port: '5432', username: 'user', password: 'pass' }
|
|
25
25
|
});
|
|
26
|
-
const result = await
|
|
26
|
+
const result = await listServers({});
|
|
27
27
|
expect(result.servers).toHaveLength(3);
|
|
28
|
-
expect(result.servers.map(s => s.name)).toContain('dev');
|
|
29
|
-
expect(result.servers.map(s => s.name)).toContain('staging');
|
|
30
|
-
expect(result.servers.map(s => s.name)).toContain('prod');
|
|
28
|
+
expect(result.servers.map((s) => s.name)).toContain('dev');
|
|
29
|
+
expect(result.servers.map((s) => s.name)).toContain('staging');
|
|
30
|
+
expect(result.servers.map((s) => s.name)).toContain('prod');
|
|
31
31
|
});
|
|
32
32
|
it('should filter servers by name', async () => {
|
|
33
33
|
process.env.POSTGRES_SERVERS = JSON.stringify({
|
|
@@ -35,11 +35,11 @@ describe('Server Tools', () => {
|
|
|
35
35
|
dev_backup: { host: 'dev-backup.example.com', port: '5432', username: 'user', password: 'pass' },
|
|
36
36
|
prod: { host: 'prod.example.com', port: '5432', username: 'user', password: 'pass' }
|
|
37
37
|
});
|
|
38
|
-
const result = await
|
|
38
|
+
const result = await listServers({ filter: 'dev' });
|
|
39
39
|
expect(result.servers).toHaveLength(2);
|
|
40
|
-
expect(result.servers.map(s => s.name)).toContain('dev');
|
|
41
|
-
expect(result.servers.map(s => s.name)).toContain('dev_backup');
|
|
42
|
-
expect(result.servers.map(s => s.name)).not.toContain('prod');
|
|
40
|
+
expect(result.servers.map((s) => s.name)).toContain('dev');
|
|
41
|
+
expect(result.servers.map((s) => s.name)).toContain('dev_backup');
|
|
42
|
+
expect(result.servers.map((s) => s.name)).not.toContain('prod');
|
|
43
43
|
});
|
|
44
44
|
it('should filter servers by host', async () => {
|
|
45
45
|
process.env.POSTGRES_SERVERS = JSON.stringify({
|
|
@@ -47,24 +47,48 @@ describe('Server Tools', () => {
|
|
|
47
47
|
server2: { host: 'us-west.example.com', port: '5432', username: 'user', password: 'pass' },
|
|
48
48
|
server3: { host: 'eu.example.com', port: '5432', username: 'user', password: 'pass' }
|
|
49
49
|
});
|
|
50
|
-
const result = await
|
|
50
|
+
const result = await listServers({ filter: 'us-' });
|
|
51
51
|
expect(result.servers).toHaveLength(2);
|
|
52
52
|
});
|
|
53
53
|
it('should show server connection status', async () => {
|
|
54
54
|
process.env.POSTGRES_SERVERS = JSON.stringify({
|
|
55
55
|
dev: { host: 'localhost', port: '5432', username: 'user', password: 'pass' }
|
|
56
56
|
});
|
|
57
|
-
const result = await
|
|
57
|
+
const result = await listServers({});
|
|
58
58
|
expect(result.servers[0].isConnected).toBe(false);
|
|
59
59
|
});
|
|
60
60
|
it('should use default port when not specified', async () => {
|
|
61
61
|
process.env.POSTGRES_SERVERS = JSON.stringify({
|
|
62
62
|
dev: { host: 'localhost', username: 'user', password: 'pass' }
|
|
63
63
|
});
|
|
64
|
-
const result = await
|
|
64
|
+
const result = await listServers({});
|
|
65
65
|
expect(result.servers[0].port).toBe('5432');
|
|
66
66
|
});
|
|
67
67
|
});
|
|
68
|
+
describe('listDatabases', () => {
|
|
69
|
+
it('should require serverName parameter', async () => {
|
|
70
|
+
process.env.POSTGRES_SERVERS = JSON.stringify({
|
|
71
|
+
dev: { host: 'localhost', port: '5432', username: 'user', password: 'pass' }
|
|
72
|
+
});
|
|
73
|
+
await expect(listDatabases({ serverName: '' }))
|
|
74
|
+
.rejects.toThrow('serverName is required');
|
|
75
|
+
});
|
|
76
|
+
it('should throw when server not found', async () => {
|
|
77
|
+
process.env.POSTGRES_SERVERS = JSON.stringify({
|
|
78
|
+
dev: { host: 'localhost', port: '5432', username: 'user', password: 'pass' }
|
|
79
|
+
});
|
|
80
|
+
await expect(listDatabases({ serverName: 'nonexistent' }))
|
|
81
|
+
.rejects.toThrow("Server 'nonexistent' not found");
|
|
82
|
+
});
|
|
83
|
+
it('should include available servers in error message', async () => {
|
|
84
|
+
process.env.POSTGRES_SERVERS = JSON.stringify({
|
|
85
|
+
dev: { host: 'localhost', port: '5432', username: 'user', password: 'pass' },
|
|
86
|
+
prod: { host: 'prod.example.com', port: '5432', username: 'user', password: 'pass' }
|
|
87
|
+
});
|
|
88
|
+
await expect(listDatabases({ serverName: 'nonexistent' }))
|
|
89
|
+
.rejects.toThrow('Available servers: dev, prod');
|
|
90
|
+
});
|
|
91
|
+
});
|
|
68
92
|
describe('switchServerDb', () => {
|
|
69
93
|
it('should throw when server not found', async () => {
|
|
70
94
|
process.env.POSTGRES_SERVERS = JSON.stringify({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/server-tools.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/server-tools.test.ts"],"names":[],"mappings":"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"}
|