@yawlabs/postgres-mcp 0.9.0 → 0.9.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/CHANGELOG.md CHANGED
@@ -7,6 +7,44 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.9.1] - 2026-08-07
11
+
12
+ ### Fixed
13
+
14
+ - **Corrected the runtime startup figures published in 0.9.0.** They were wrong
15
+ in both magnitude and direction, and the README used them to advise opting
16
+ out of the faster runtime.
17
+
18
+ The 0.9.0 numbers (Node ~650-900ms, oam ~980-1290ms, launcher-to-oam ~1.8s)
19
+ were measured against cold, freshly-built binaries. On Windows a binary that
20
+ is not in the on-access scanner's cache is rescanned on every exec, while
21
+ `node` resolved from PATH was cached long ago -- so the comparison measured
22
+ the scanner and put the entire penalty on the binary under test.
23
+
24
+ Re-measured on the same hardware with every binary warmed first, mean of 12
25
+ runs, `postgres-mcp version` (full module init):
26
+
27
+ | path | startup |
28
+ |---|---|
29
+ | standalone binary (`oam compile`) | 298ms |
30
+ | `oam run dist/index.js` | 306ms |
31
+ | `node dist/index.js` | 358ms |
32
+ | launcher -> Node (in-process) | 370ms |
33
+ | launcher -> oam (spawn) | 409ms |
34
+
35
+ oam starts faster than Node. What the launcher costs is the spawn: reaching
36
+ oam means Node has already booted, and that ~100ms hop outweighs oam's ~52ms
37
+ advantage, so the two land within ~40ms of each other through the npm `bin`.
38
+ `POSTGRES_MCP_RUNTIME=node` remains available but is now a marginal
39
+ difference, not the meaningful one 0.9.0 described.
40
+
41
+ No behavior changed -- `auto` (prefer oam) was and remains the default, and
42
+ it was the right default for the wrong stated reason. README, CHANGELOG, and
43
+ the launcher's header comment are corrected; the launcher comment also
44
+ records the measurement trap so the mistake is not repeated.
45
+
46
+ ## [0.9.0] - 2026-08-07
47
+
10
48
  ### Added
11
49
 
12
50
  - The `postgres-mcp` command is now a runtime launcher (`bin/postgres-mcp.mjs`)
@@ -31,11 +69,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
31
69
  a one-time cost per MCP session rather than per tool call, but it is a real
32
70
  regression against plain Node -- `POSTGRES_MCP_RUNTIME=node` opts out.
33
71
 
34
- > **Version note:** the "Changed (breaking)" entries below alter the shape of
35
- > tool output and the CLI's exit behavior. Under SemVer-for-0.x that makes the
36
- > next release a MINOR bump -- `0.8.0`, not `0.7.1`. `release.sh` performs the
37
- > actual bump (`npm version`) and syncs `server.json`, so nothing is pre-bumped
38
- > here; pass `0.8.0` when cutting the release.
72
+ > **These figures are wrong. See 0.9.1.** They were measured against cold,
73
+ > freshly-built binaries and reflect the Windows on-access virus scanner, not
74
+ > either runtime. oam is in fact faster than Node here. Left in place rather
75
+ > than rewritten so the correction has something to point at.
76
+
77
+ ## [0.8.0] - 2026-08-07
39
78
 
40
79
  ### Changed (breaking)
41
80
 
@@ -130,6 +169,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
130
169
  (PG17), and with only 17/18 in the matrix the pre-1.11 branch was never
131
170
  selected.
132
171
 
172
+ ## [0.7.0] - 2026-07-21
173
+
174
+ Backfilled from `git log v0.6.20..v0.7.0` -- this release shipped without a
175
+ CHANGELOG entry. Summarized from commit subjects rather than re-derived from
176
+ the diff, so it is less detailed than the entries around it.
177
+
178
+ ### Added
179
+
180
+ - `pg_table_bloat`: `approx` and `exact` methods via `pgstattuple` (#19).
181
+ - `pg_top_queries`: `io_read_time_ms` / `io_write_time_ms` on
182
+ `pg_stat_statements` >= 1.10 (#16).
183
+ - Cross-platform single-binary release pipeline (Scoop + Homebrew), released
184
+ as 0.6.21.
185
+
186
+ ### Fixed
187
+
188
+ - `pg_list_tables`: cast `reltuples` to `float8` so `estimated_rows` is a
189
+ number rather than a string (#17).
190
+ - 10 confirmed findings from a review of `f7b7cb3..a736200` (#21).
191
+
192
+ ### Removed
193
+
194
+ - GitHub Actions workflows and the dependabot config (#24). This is why the
195
+ repo has no `.github/` directory and why `release.sh` is the only release
196
+ path; several stale comments referring to CI survived until 0.8.0.
197
+
133
198
  ## [0.6.20] - 2026-06-04
134
199
 
135
200
  ### Fixed
package/README.md CHANGED
@@ -213,7 +213,21 @@ The published `postgres-mcp` command is a small launcher that prefers the [oam](
213
213
 
214
214
  **If you do have oam,** the server runs under it. Verified equivalent on both runtimes: all 21 tools register, queries return identical rows and `dataTypeName` values, and the error paths match. oam supplies every `node:` builtin the driver needs, including `net`, `tls`, `crypto`, and `dns` (SCRAM auth and the extended query protocol both work).
215
215
 
216
- **Cost, stated plainly.** Taking the oam path means Node has already booted, so you pay both startups. Measured on windows-arm64 against the 1.4 MB bundle: Node alone ~650-900ms, oam alone ~980-1290ms, launcher-to-oam ~1.8s. This is a **one-time cost per MCP session**, not per tool call -- hosts spawn the server once and hold it open -- but if you care about launch latency, set `POSTGRES_MCP_RUNTIME=node`.
216
+ **Startup cost, measured.** windows-arm64, 1.4 MB bundle, `postgres-mcp version` (full module init), every binary warmed first, mean of 12 runs:
217
+
218
+ | path | startup |
219
+ |---|---|
220
+ | standalone binary (`oam compile`) | 298ms |
221
+ | `oam run dist/index.js` | 306ms |
222
+ | `node dist/index.js` | 358ms |
223
+ | launcher -> Node (in-process) | 370ms |
224
+ | launcher -> oam (spawn) | 409ms |
225
+
226
+ oam starts **faster** than Node here. What the launcher costs is the *spawn*: reaching oam means Node has already booted, and that hop (~100ms) is larger than oam's ~52ms advantage. So through the npm `bin`, the two land within ~40ms of each other, and `POSTGRES_MCP_RUNTIME=node` is a marginal win rather than a meaningful one.
227
+
228
+ Either way it is a **one-time cost per MCP session**, not per tool call -- hosts spawn the server once and hold it open. If startup genuinely matters, the standalone binary avoids the launcher entirely and is the fastest option.
229
+
230
+ > Earlier releases of this README reported ~650-900ms for Node and ~980-1290ms for oam, and advised opting out of oam on that basis. Those figures were measured against cold, freshly-built binaries and reflected the Windows on-access virus scanner rather than either runtime. They were wrong in both magnitude and direction. Corrected in 0.9.1.
217
231
 
218
232
  ```jsonc
219
233
  {
@@ -15,12 +15,23 @@
15
15
  * resolving a few paths (a handful of `existsSync` calls, no subprocess).
16
16
  *
17
17
  * WHAT THE OAM PATH COSTS
18
- * Taking the oam path means node has already booted, so the total is node's
19
- * startup plus oam's. Measured on windows-arm64 against the 1.4 MB bundle:
20
- * node alone ~650-900ms, oam alone ~980-1290ms, so the oam path lands near
21
- * ~1.8s. This is a ONE-TIME cost per MCP session, not per tool call -- hosts
22
- * spawn the server once and keep it -- but it is a real regression against
23
- * plain node and the reason `POSTGRES_MCP_RUNTIME=node` exists.
18
+ * The spawn, not the runtime. windows-arm64, 1.4 MB bundle, warmed binaries,
19
+ * mean of 12 runs: oam run 306ms, node 358ms -- oam is the FASTER of the two.
20
+ * But reaching oam from here means node has already booted, and that hop
21
+ * (~100ms) outweighs oam's ~52ms advantage: launcher -> node 370ms,
22
+ * launcher -> oam 409ms. So the two land within ~40ms through the npm bin.
23
+ * A one-time cost per MCP session either way, not per tool call.
24
+ *
25
+ * The `oam compile` standalone binary sidesteps this entirely (298ms, no
26
+ * launcher, no spawn) and is the right answer if startup actually matters.
27
+ *
28
+ * DO NOT re-measure this by timing a freshly built binary. On Windows a
29
+ * binary that is not in the on-access scanner's cache gets rescanned on every
30
+ * exec, while `node` from PATH was cached long ago -- the comparison then
31
+ * measures the scanner and dumps the whole penalty on the new binary. That
32
+ * mistake produced the numbers published in 0.9.0 (node ~650-900ms, oam
33
+ * ~980-1290ms), which were wrong in both magnitude and direction. Warm every
34
+ * candidate first, or stage it out of the build directory.
24
35
  *
25
36
  * SELECTION
26
37
  * POSTGRES_MCP_RUNTIME=oam require oam; fail loudly if it is missing
package/dist/index.js CHANGED
@@ -37796,7 +37796,7 @@ function compareVersions(a, b) {
37796
37796
  }
37797
37797
 
37798
37798
  // src/index.ts
37799
- var version2 = true ? "0.9.0" : await readPackageVersion();
37799
+ var version2 = true ? "0.9.1" : await readPackageVersion();
37800
37800
  var subcommand = process.argv[2];
37801
37801
  if (subcommand === "version" || subcommand === "--version") {
37802
37802
  console.log(version2);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yawlabs/postgres-mcp",
3
- "version": "0.9.0",
3
+ "version": "0.9.1",
4
4
  "mcpName": "io.github.YawLabs/postgres-mcp",
5
5
  "description": "PostgreSQL MCP server - query, schema introspection, explain, and health checks for AI assistants",
6
6
  "license": "MIT",