@apono-io/mcp-postgres 0.3.0 → 0.4.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.
- package/README.md +16 -0
- package/dist/__tests__/db.test.js +1 -1
- package/dist/__tests__/db.test.js.map +1 -1
- package/dist/__tests__/pool-health.test.d.ts +2 -0
- package/dist/__tests__/pool-health.test.d.ts.map +1 -0
- package/dist/__tests__/pool-health.test.js +57 -0
- package/dist/__tests__/pool-health.test.js.map +1 -0
- package/dist/__tests__/timeout.test.d.ts +2 -0
- package/dist/__tests__/timeout.test.d.ts.map +1 -0
- package/dist/__tests__/timeout.test.js +121 -0
- package/dist/__tests__/timeout.test.js.map +1 -0
- package/dist/db.d.ts +2 -0
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +60 -0
- package/dist/db.js.map +1 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +8 -15
- package/dist/tools.js.map +1 -1
- package/package.json +6 -1
package/README.md
CHANGED
|
@@ -23,3 +23,19 @@ All tools accept a `database` parameter to specify which database to operate on.
|
|
|
23
23
|
| `POSTGRES_PORT` | PostgreSQL server port (default: 5432) |
|
|
24
24
|
| `POSTGRES_USER` | Database username |
|
|
25
25
|
| `POSTGRES_PASSWORD` | Database password |
|
|
26
|
+
| `PGSSLMODE` | `disable` turns TLS off; otherwise TLS without certificate verification |
|
|
27
|
+
| `POSTGRES_STATEMENT_TIMEOUT_MS` | How long a statement may run, in milliseconds (default: 600000, `0` keeps the server's own setting) |
|
|
28
|
+
| `POSTGRES_IDLE_IN_TRANSACTION_TIMEOUT_MS` | How long a transaction may sit idle, in milliseconds (default: 60000, `0` keeps the server's own setting) |
|
|
29
|
+
|
|
30
|
+
## How long a statement may run
|
|
31
|
+
|
|
32
|
+
Every statement runs with `statement_timeout` and
|
|
33
|
+
`idle_in_transaction_session_timeout` applied. PostgreSQL enforces both itself, so a
|
|
34
|
+
statement that outlives its client still ends, and the snapshot it holds is released
|
|
35
|
+
rather than blocking vacuum until the query finishes on its own.
|
|
36
|
+
|
|
37
|
+
A pooled connection keeps whatever a caller `SET` on it, so both are reapplied on
|
|
38
|
+
each checkout. A caller can still raise either one for the duration of its own
|
|
39
|
+
statement — these bound an accidental runaway query, not a deliberate one — but that
|
|
40
|
+
change does not carry over to the next call.
|
|
41
|
+
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.test.js","sourceRoot":"","sources":["../../src/__tests__/db.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,SAAS,QAAQ,CAAC,EAAU;IAC1B,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"db.test.js","sourceRoot":"","sources":["../../src/__tests__/db.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,SAAS,QAAQ,CAAC,EAAU;IAC1B,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;AAChE,CAAC;AAED,IAAI,OAAO,GAAkC,EAAE,CAAC;AAChD,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE;IACtB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,IAAI,CAAC;AACd,CAAC,CAAC,CAAC;AAEH,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AACpB,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAEzC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAE7C,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;AAGpC,MAAM,OAAO,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAwB,CAAC;AAClF,MAAM,aAAa,GAAG,EAAE,CAAC,aAAa,CAAC;AAEvC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,aAAa,EAAE,CAAC;QACtB,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,GAAG,CAAC,SAAS,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAEhC,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,oBAAoB,EAAE,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAE/B,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,oBAAoB,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAE/E,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAEtE,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAClD,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAEnD,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,OAAO,CAAC,OAAO,CAAC,CAAC;QACjB,OAAO,CAAC,OAAO,CAAC,CAAC;QAEjB,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool-health.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/pool-health.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll, afterAll, afterEach } from 'vitest';
|
|
2
|
+
import { useTestCredentials, withMaintenance } from './helpers/database.js';
|
|
3
|
+
const DATABASE = 'mcp_postgres_pool_health_test';
|
|
4
|
+
describe('pool health', () => {
|
|
5
|
+
let tools;
|
|
6
|
+
let closeAllPools;
|
|
7
|
+
async function execute(sql) {
|
|
8
|
+
return tools.get('execute')({ database: DATABASE, sql });
|
|
9
|
+
}
|
|
10
|
+
beforeAll(async () => {
|
|
11
|
+
await withMaintenance(async (client) => {
|
|
12
|
+
await client.query(`DROP DATABASE IF EXISTS ${DATABASE}`);
|
|
13
|
+
await client.query(`CREATE DATABASE ${DATABASE}`);
|
|
14
|
+
});
|
|
15
|
+
useTestCredentials();
|
|
16
|
+
const toolsModule = await import('../tools.js');
|
|
17
|
+
closeAllPools = (await import('../db.js')).closeAllPools;
|
|
18
|
+
tools = new Map();
|
|
19
|
+
toolsModule.registerTools({
|
|
20
|
+
tool: (name, _d, _s, handler) => {
|
|
21
|
+
tools.set(name, handler);
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
afterEach(async () => {
|
|
26
|
+
await closeAllPools?.();
|
|
27
|
+
});
|
|
28
|
+
afterAll(async () => {
|
|
29
|
+
await closeAllPools?.();
|
|
30
|
+
await withMaintenance(async (client) => {
|
|
31
|
+
await client.query(`DROP DATABASE IF EXISTS ${DATABASE}`);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
it('survives the server ending a client left idle in a transaction', async () => {
|
|
35
|
+
process.env.POSTGRES_IDLE_IN_TRANSACTION_TIMEOUT_MS = '300';
|
|
36
|
+
await closeAllPools();
|
|
37
|
+
try {
|
|
38
|
+
expect((await execute('BEGIN')).isError).toBeUndefined();
|
|
39
|
+
await new Promise((resolve) => setTimeout(resolve, 1_500));
|
|
40
|
+
const afterwards = await execute('SELECT 1 AS ok');
|
|
41
|
+
expect(afterwards.isError).toBeUndefined();
|
|
42
|
+
expect(afterwards.content[0].text).toContain('1');
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
delete process.env.POSTGRES_IDLE_IN_TRANSACTION_TIMEOUT_MS;
|
|
46
|
+
await closeAllPools();
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
it('does not hand a broken client to the next call', async () => {
|
|
50
|
+
const failed = await execute('BEGIN; SELECT 1/0');
|
|
51
|
+
expect(failed.isError).toBe(true);
|
|
52
|
+
const afterwards = await tools.get('list_tables')({ database: DATABASE, schema: 'public' });
|
|
53
|
+
expect(afterwards.isError).toBeUndefined();
|
|
54
|
+
expect(afterwards.content[0].text).not.toContain('aborted');
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=pool-health.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool-health.test.js","sourceRoot":"","sources":["../../src/__tests__/pool-health.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/timeout.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll, afterAll, afterEach } from 'vitest';
|
|
2
|
+
import { useTestCredentials, withMaintenance } from './helpers/database.js';
|
|
3
|
+
const DATABASE = 'mcp_postgres_timeout_test';
|
|
4
|
+
describe('statement timeouts', () => {
|
|
5
|
+
let tools;
|
|
6
|
+
let closeAllPools;
|
|
7
|
+
async function execute(sql) {
|
|
8
|
+
return tools.get('execute')({ database: DATABASE, sql });
|
|
9
|
+
}
|
|
10
|
+
async function withTimeouts(variables, run) {
|
|
11
|
+
for (const [name, value] of Object.entries(variables)) {
|
|
12
|
+
if (value === undefined)
|
|
13
|
+
delete process.env[name];
|
|
14
|
+
else
|
|
15
|
+
process.env[name] = value;
|
|
16
|
+
}
|
|
17
|
+
await closeAllPools();
|
|
18
|
+
try {
|
|
19
|
+
await run();
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
for (const name of Object.keys(variables))
|
|
23
|
+
delete process.env[name];
|
|
24
|
+
await closeAllPools();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
beforeAll(async () => {
|
|
28
|
+
await withMaintenance(async (client) => {
|
|
29
|
+
await client.query(`DROP DATABASE IF EXISTS ${DATABASE}`);
|
|
30
|
+
await client.query(`CREATE DATABASE ${DATABASE}`);
|
|
31
|
+
});
|
|
32
|
+
useTestCredentials();
|
|
33
|
+
const toolsModule = await import('../tools.js');
|
|
34
|
+
closeAllPools = (await import('../db.js')).closeAllPools;
|
|
35
|
+
tools = new Map();
|
|
36
|
+
toolsModule.registerTools({
|
|
37
|
+
tool: (name, _d, _s, handler) => {
|
|
38
|
+
tools.set(name, handler);
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
afterEach(async () => {
|
|
43
|
+
await closeAllPools?.();
|
|
44
|
+
});
|
|
45
|
+
afterAll(async () => {
|
|
46
|
+
await closeAllPools?.();
|
|
47
|
+
await withMaintenance(async (client) => {
|
|
48
|
+
await client.query(`DROP DATABASE IF EXISTS ${DATABASE}`);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
it('carries a statement timeout by default', async () => {
|
|
52
|
+
const result = await execute('SHOW statement_timeout');
|
|
53
|
+
expect(result.isError).toBeUndefined();
|
|
54
|
+
expect(result.content[0].text).toContain('10min');
|
|
55
|
+
});
|
|
56
|
+
it('carries an idle-in-transaction timeout by default', async () => {
|
|
57
|
+
const result = await execute('SHOW idle_in_transaction_session_timeout');
|
|
58
|
+
expect(result.isError).toBeUndefined();
|
|
59
|
+
expect(result.content[0].text).toContain('1min');
|
|
60
|
+
});
|
|
61
|
+
it('lets the server abort a statement that outruns the timeout', async () => {
|
|
62
|
+
await withTimeouts({ POSTGRES_STATEMENT_TIMEOUT_MS: '300' }, async () => {
|
|
63
|
+
const result = await execute('SELECT pg_sleep(5)');
|
|
64
|
+
expect(result.isError).toBe(true);
|
|
65
|
+
expect(result.content[0].text).toContain('statement timeout');
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
it('aborts the statement without the client giving up first', async () => {
|
|
69
|
+
await withTimeouts({ POSTGRES_STATEMENT_TIMEOUT_MS: '300' }, async () => {
|
|
70
|
+
const started = Date.now();
|
|
71
|
+
await execute('SELECT pg_sleep(5)');
|
|
72
|
+
expect(Date.now() - started).toBeLessThan(4_000);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
it('takes a timeout from the environment', async () => {
|
|
76
|
+
await withTimeouts({ POSTGRES_STATEMENT_TIMEOUT_MS: '2000' }, async () => {
|
|
77
|
+
const result = await execute('SHOW statement_timeout');
|
|
78
|
+
expect(result.content[0].text).toContain('2s');
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
it('leaves the server setting alone when the timeout is zero', async () => {
|
|
82
|
+
await withTimeouts({ POSTGRES_STATEMENT_TIMEOUT_MS: '0' }, async () => {
|
|
83
|
+
const result = await execute('SHOW statement_timeout');
|
|
84
|
+
expect(result.content[0].text).toContain('"statement_timeout": "0"');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
it('refuses a value past what the server accepts, rather than breaking the pool', async () => {
|
|
88
|
+
await withTimeouts({ POSTGRES_STATEMENT_TIMEOUT_MS: '3000000000' }, async () => {
|
|
89
|
+
const result = await execute('SHOW statement_timeout');
|
|
90
|
+
expect(result.isError).toBeUndefined();
|
|
91
|
+
expect(result.content[0].text).toContain('10min');
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
it('falls back to the default when the variable is only whitespace', async () => {
|
|
95
|
+
await withTimeouts({ POSTGRES_STATEMENT_TIMEOUT_MS: ' ' }, async () => {
|
|
96
|
+
const result = await execute('SHOW statement_timeout');
|
|
97
|
+
expect(result.content[0].text).toContain('10min');
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
it('restores the timeout for the next call after a caller clears it', async () => {
|
|
101
|
+
await execute('SET statement_timeout = 0');
|
|
102
|
+
const result = await execute('SHOW statement_timeout');
|
|
103
|
+
expect(result.content[0].text).toContain('10min');
|
|
104
|
+
});
|
|
105
|
+
it('still aborts a long statement after a caller clears the timeout', async () => {
|
|
106
|
+
await withTimeouts({ POSTGRES_STATEMENT_TIMEOUT_MS: '300' }, async () => {
|
|
107
|
+
await execute('SET statement_timeout = 0');
|
|
108
|
+
const started = Date.now();
|
|
109
|
+
const result = await execute('SELECT pg_sleep(5)');
|
|
110
|
+
expect(result.isError).toBe(true);
|
|
111
|
+
expect(Date.now() - started).toBeLessThan(4_000);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
it('falls back to the default when the variable is not a timeout', async () => {
|
|
115
|
+
await withTimeouts({ POSTGRES_STATEMENT_TIMEOUT_MS: 'soon' }, async () => {
|
|
116
|
+
const result = await execute('SHOW statement_timeout');
|
|
117
|
+
expect(result.content[0].text).toContain('10min');
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=timeout.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.test.js","sourceRoot":"","sources":["../../src/__tests__/timeout.test.ts"],"names":[],"mappings":"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"}
|
package/dist/db.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import pg from 'pg';
|
|
2
2
|
export declare function getPool(database: string): pg.Pool;
|
|
3
|
+
export declare function query(database: string, sql: string, values?: unknown[]): Promise<pg.QueryResult>;
|
|
4
|
+
export declare function executeStatement(database: string, sql: string): Promise<pg.QueryResult | pg.QueryResult[]>;
|
|
3
5
|
export declare function closeAllPools(): Promise<void>;
|
|
4
6
|
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAuDpB,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,EAAE,CAAC,IAAI,CAQjD;AAiBD,wBAAsB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAEtG;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAEhH;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAOnD"}
|
package/dist/db.js
CHANGED
|
@@ -1,7 +1,41 @@
|
|
|
1
1
|
import pg from 'pg';
|
|
2
2
|
import { log } from './logger.js';
|
|
3
3
|
const pools = new Map();
|
|
4
|
+
const DEFAULT_STATEMENT_TIMEOUT_MS = 10 * 60 * 1_000;
|
|
5
|
+
const DEFAULT_IDLE_IN_TRANSACTION_TIMEOUT_MS = 60 * 1_000;
|
|
6
|
+
const MAX_TIMEOUT_MS = 2_147_483_647;
|
|
7
|
+
function timeoutMillis(variable, fallback) {
|
|
8
|
+
const raw = process.env[variable];
|
|
9
|
+
if (raw === undefined)
|
|
10
|
+
return fallback;
|
|
11
|
+
const trimmed = raw.trim();
|
|
12
|
+
if (trimmed === '')
|
|
13
|
+
return fallback;
|
|
14
|
+
if (!/^\d+$/.test(trimmed) || Number(trimmed) > MAX_TIMEOUT_MS) {
|
|
15
|
+
log(`Ignoring ${variable}=${raw}, expected whole milliseconds up to ${MAX_TIMEOUT_MS}`);
|
|
16
|
+
return fallback;
|
|
17
|
+
}
|
|
18
|
+
return Number(trimmed);
|
|
19
|
+
}
|
|
20
|
+
function statementTimeout() {
|
|
21
|
+
return timeoutMillis('POSTGRES_STATEMENT_TIMEOUT_MS', DEFAULT_STATEMENT_TIMEOUT_MS);
|
|
22
|
+
}
|
|
23
|
+
function idleInTransactionTimeout() {
|
|
24
|
+
return timeoutMillis('POSTGRES_IDLE_IN_TRANSACTION_TIMEOUT_MS', DEFAULT_IDLE_IN_TRANSACTION_TIMEOUT_MS);
|
|
25
|
+
}
|
|
26
|
+
function timeoutSql() {
|
|
27
|
+
const statements = [];
|
|
28
|
+
const statement = statementTimeout();
|
|
29
|
+
const idle = idleInTransactionTimeout();
|
|
30
|
+
if (statement > 0)
|
|
31
|
+
statements.push(`SET statement_timeout = ${statement}`);
|
|
32
|
+
if (idle > 0)
|
|
33
|
+
statements.push(`SET idle_in_transaction_session_timeout = ${idle}`);
|
|
34
|
+
return statements.join('; ');
|
|
35
|
+
}
|
|
4
36
|
function getPoolConfig() {
|
|
37
|
+
const statement = statementTimeout();
|
|
38
|
+
const idle = idleInTransactionTimeout();
|
|
5
39
|
return {
|
|
6
40
|
host: process.env.POSTGRES_HOST,
|
|
7
41
|
port: process.env.POSTGRES_PORT ? parseInt(process.env.POSTGRES_PORT, 10) : 5432,
|
|
@@ -10,6 +44,8 @@ function getPoolConfig() {
|
|
|
10
44
|
ssl: process.env.PGSSLMODE === 'disable' ? false : { rejectUnauthorized: false },
|
|
11
45
|
max: 5,
|
|
12
46
|
idleTimeoutMillis: 30_000,
|
|
47
|
+
...(statement > 0 ? { statement_timeout: statement } : {}),
|
|
48
|
+
...(idle > 0 ? { idle_in_transaction_session_timeout: idle } : {}),
|
|
13
49
|
};
|
|
14
50
|
}
|
|
15
51
|
export function getPool(database) {
|
|
@@ -17,9 +53,33 @@ export function getPool(database) {
|
|
|
17
53
|
if (existing)
|
|
18
54
|
return existing;
|
|
19
55
|
const pool = new pg.Pool({ ...getPoolConfig(), database });
|
|
56
|
+
pool.on('error', (err) => log(`Idle client error on ${database}:`, err));
|
|
20
57
|
pools.set(database, pool);
|
|
21
58
|
return pool;
|
|
22
59
|
}
|
|
60
|
+
async function runBounded(database, sql, values) {
|
|
61
|
+
const client = await getPool(database).connect();
|
|
62
|
+
let failure;
|
|
63
|
+
try {
|
|
64
|
+
const timeouts = timeoutSql();
|
|
65
|
+
if (timeouts)
|
|
66
|
+
await client.query(timeouts);
|
|
67
|
+
return await client.query(sql, values);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
failure = err;
|
|
71
|
+
throw err;
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
client.release(failure);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export async function query(database, sql, values) {
|
|
78
|
+
return (await runBounded(database, sql, values));
|
|
79
|
+
}
|
|
80
|
+
export async function executeStatement(database, sql) {
|
|
81
|
+
return (await runBounded(database, sql));
|
|
82
|
+
}
|
|
23
83
|
export async function closeAllPools() {
|
|
24
84
|
const open = [...pools.values()];
|
|
25
85
|
pools.clear();
|
package/dist/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;AAEzC,SAAS,aAAa;IACpB,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;QAC/B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;QAChF,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;QAC/B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;QACvC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE;QAChF,GAAG,EAAE,CAAC;QACN,iBAAiB,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0CpE,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0CpE,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiJrD"}
|
package/dist/tools.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { executeStatement, query } from './db.js';
|
|
3
3
|
import { log } from './logger.js';
|
|
4
4
|
function textContent(text) {
|
|
5
5
|
return { content: [{ type: 'text', text }] };
|
|
@@ -36,8 +36,7 @@ export function registerTools(server) {
|
|
|
36
36
|
server.tool('list_databases', 'List all databases on the PostgreSQL server.', {}, async () => {
|
|
37
37
|
log('Tool called: list_databases');
|
|
38
38
|
try {
|
|
39
|
-
const
|
|
40
|
-
const result = await pool.query(`SELECT d.datname AS name, pg_catalog.pg_get_userbyid(d.datdba) AS owner, pg_catalog.pg_encoding_to_char(d.encoding) AS encoding
|
|
39
|
+
const result = await query('postgres', `SELECT d.datname AS name, pg_catalog.pg_get_userbyid(d.datdba) AS owner, pg_catalog.pg_encoding_to_char(d.encoding) AS encoding
|
|
41
40
|
FROM pg_catalog.pg_database d
|
|
42
41
|
WHERE d.datistemplate = false
|
|
43
42
|
ORDER BY d.datname`);
|
|
@@ -50,8 +49,7 @@ export function registerTools(server) {
|
|
|
50
49
|
server.tool('execute', 'Execute a SQL statement. Use this for every statement, including SELECT.', { database: z.string().describe('The database to execute against'), sql: z.string().describe('The SQL statement to execute') }, async ({ database, sql }) => {
|
|
51
50
|
log(`Tool called: execute on ${database}`);
|
|
52
51
|
try {
|
|
53
|
-
const
|
|
54
|
-
const result = await pool.query(sql);
|
|
52
|
+
const result = await executeStatement(database, sql);
|
|
55
53
|
return textContent(formatExecuteResult(result));
|
|
56
54
|
}
|
|
57
55
|
catch (err) {
|
|
@@ -61,8 +59,7 @@ export function registerTools(server) {
|
|
|
61
59
|
server.tool('list_schemas', 'List all schemas in the database.', { database: z.string().describe('The database to inspect') }, async ({ database }) => {
|
|
62
60
|
log(`Tool called: list_schemas on ${database}`);
|
|
63
61
|
try {
|
|
64
|
-
const
|
|
65
|
-
const result = await pool.query(`SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('pg_catalog', 'information_schema', 'pg_toast') ORDER BY schema_name`);
|
|
62
|
+
const result = await query(database, `SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('pg_catalog', 'information_schema', 'pg_toast') ORDER BY schema_name`);
|
|
66
63
|
const schemas = result.rows.map((r) => r.schema_name);
|
|
67
64
|
if (schemas.length === 0) {
|
|
68
65
|
return textContent('No schemas found. Note: this may be due to insufficient permissions granted to the current database user.');
|
|
@@ -79,8 +76,7 @@ export function registerTools(server) {
|
|
|
79
76
|
}, async ({ database, schema }) => {
|
|
80
77
|
log(`Tool called: list_tables on ${database}.${schema}`);
|
|
81
78
|
try {
|
|
82
|
-
const
|
|
83
|
-
const result = await pool.query(`SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = $1 ORDER BY table_name`, [schema]);
|
|
79
|
+
const result = await query(database, `SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = $1 ORDER BY table_name`, [schema]);
|
|
84
80
|
return textContent(formatRows(result.rows));
|
|
85
81
|
}
|
|
86
82
|
catch (err) {
|
|
@@ -94,8 +90,7 @@ export function registerTools(server) {
|
|
|
94
90
|
}, async ({ database, table, schema }) => {
|
|
95
91
|
log(`Tool called: describe_table on ${database}.${schema}.${table}`);
|
|
96
92
|
try {
|
|
97
|
-
const
|
|
98
|
-
const result = await pool.query(`SELECT column_name, data_type, is_nullable, column_default, character_maximum_length
|
|
93
|
+
const result = await query(database, `SELECT column_name, data_type, is_nullable, column_default, character_maximum_length
|
|
99
94
|
FROM information_schema.columns
|
|
100
95
|
WHERE table_schema = $1 AND table_name = $2
|
|
101
96
|
ORDER BY ordinal_position`, [schema, table]);
|
|
@@ -108,8 +103,7 @@ export function registerTools(server) {
|
|
|
108
103
|
server.tool('list_extensions', 'List installed PostgreSQL extensions.', { database: z.string().describe('The database to inspect') }, async ({ database }) => {
|
|
109
104
|
log(`Tool called: list_extensions on ${database}`);
|
|
110
105
|
try {
|
|
111
|
-
const
|
|
112
|
-
const result = await pool.query(`SELECT extname, extversion FROM pg_extension ORDER BY extname`);
|
|
106
|
+
const result = await query(database, `SELECT extname, extversion FROM pg_extension ORDER BY extname`);
|
|
113
107
|
return textContent(formatRows(result.rows));
|
|
114
108
|
}
|
|
115
109
|
catch (err) {
|
|
@@ -123,8 +117,7 @@ export function registerTools(server) {
|
|
|
123
117
|
}, async ({ database, table, schema }) => {
|
|
124
118
|
log(`Tool called: get_table_indexes on ${database}.${schema}.${table}`);
|
|
125
119
|
try {
|
|
126
|
-
const
|
|
127
|
-
const result = await pool.query(`SELECT indexname, indexdef
|
|
120
|
+
const result = await query(database, `SELECT indexname, indexdef
|
|
128
121
|
FROM pg_indexes
|
|
129
122
|
WHERE schemaname = $1 AND tablename = $2
|
|
130
123
|
ORDER BY indexname`, [schema, table]);
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@apono-io/mcp-postgres",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Apono MCP server for PostgreSQL databases with JIT credential support",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/apono-io/apono-mcp-servers.git",
|
|
8
|
+
"directory": "packages/mcp-postgres"
|
|
9
|
+
},
|
|
5
10
|
"type": "module",
|
|
6
11
|
"main": "dist/index.js",
|
|
7
12
|
"types": "dist/index.d.ts",
|