pg-admin-mcp 0.1.1 → 0.2.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 CHANGED
@@ -24,20 +24,30 @@ or the **Docker image** (alternative — carries its own pinned PostgreSQL clien
24
24
 
25
25
  ## Quick start (npx)
26
26
 
27
- 1. **Copy the per-project template** from [`examples/per-project/`](examples/per-project/) into your
28
- project root: `.mcp.json` (committed — profiles, environment classes, capability flags) and
29
- `.env.example` (copy to `.env`, gitignored — the `PG_<ALIAS>_URL` lines with passwords).
27
+ 1. **Register the server once**, at user scope, so every project gets it:
30
28
  ```bash
31
- cp .env.example .env # then fill in the URLs
32
- mkdir -p pg-workspace # exports, backups, snapshots land here
29
+ # macOS / Linux
30
+ claude mcp add --scope user pg -- npx -y pg-admin-mcp
31
+ # Windows (native Claude Code cannot spawn the npx .cmd shim directly)
32
+ claude mcp add --scope user pg -- cmd /c npx -y pg-admin-mcp
33
33
  ```
34
- `.mcp.json` launches `npx -y pg-admin-mcp` with `PG_MCP_ENV_FILE: ".env"`; the server reads that
35
- file itself, and any key also set in `.mcp.json` wins over `.env`. On native Windows use
36
- `"command": "cmd", "args": ["/c", "npx", "-y", "pg-admin-mcp"]`.
37
- 2. **Start `claude` from the project root** — `.env` and `pg-workspace` are relative paths resolved
38
- against the directory the client was launched from.
34
+ 2. **Configure your databases** with the `.env` dialect (`PG_MCP_PROFILES`, `PG_<ALIAS>_URL`, …) in
35
+ either or both of two optional files — see [Config files](#config-files) for the exact rules:
36
+ - **Per project:** copy [`examples/per-project/.pg-mcp.env.example`](examples/per-project/) to
37
+ `.pg-mcp.env` in the project root and fill in the URLs. It is found automatically from anywhere
38
+ inside the project. Gitignore it, and `pg-workspace/` (where exports, backups and snapshots land):
39
+ ```bash
40
+ cp .pg-mcp.env.example .pg-mcp.env # then fill in the URLs
41
+ mkdir -p pg-workspace
42
+ printf '.pg-mcp.env\npg-workspace/\n' >> .gitignore
43
+ ```
44
+ - **Global (shared by all projects):** `~/.pg-admin-mcp/config.env` (Windows
45
+ `C:\Users\<you>\.pg-admin-mcp\config.env`); template in
46
+ [`examples/global/config.env.example`](examples/global/config.env.example).
47
+ Edited a file? Reconnect the MCP (`/mcp` in Claude Code) — config is read once per session.
39
48
  3. **Verify** by calling `postgres_connection_status`. It reports `runtime: "host"`, reachability, the
40
- server version, your role's privileges, and the client tool versions.
49
+ server version, your role's privileges, the client tool versions, and a `config` section showing
50
+ which files were searched and loaded.
41
51
 
42
52
  Host-mode notes:
43
53
 
@@ -47,8 +57,10 @@ Host-mode notes:
47
57
  `pg_restore`); the other 16 tools need nothing beyond Node. Install a client matching your server's
48
58
  major — Windows `winget install PostgreSQL.PostgreSQL.17`, Debian/Ubuntu
49
59
  `sudo apt install postgresql-client`, macOS `brew install libpq` — and, if it is not on `PATH`, set
50
- `PG_MCP_PG_BIN_DIR` in `.env` (Windows: `C:\Program Files\PostgreSQL\17\bin`).
60
+ `PG_MCP_PG_BIN_DIR` in your global `config.env` (Windows: `C:\Program Files\PostgreSQL\17\bin`).
51
61
  - `bunx pg-admin-mcp` should work too — untested.
62
+ - A per-project `.mcp.json` entry (same `command`/`args`) still works instead of the user-scope
63
+ registration; keys set in its `env` block win over the files.
52
64
 
53
65
  ## Quick start (Docker, alternative)
54
66
 
@@ -57,7 +69,7 @@ Host-mode notes:
57
69
  ```bash
58
70
  docker pull mrrainx/pg-admin-mcp:pg17
59
71
  ```
60
- `manifest unknown` means no release has been cut yet — see [Status](#status) for how to tell, and
72
+ `manifest unknown` means no Docker release has succeeded yet — see [Status](#status) for why, and
61
73
  [Building the image locally](#building-the-image-locally) for the interim path.
62
74
  2. **Create your env file:**
63
75
  ```bash
@@ -83,11 +95,15 @@ profile/capability model (`PG_MCP_PROFILES`, `PG_<ALIAS>_URL`, `PG_<ALIAS>_ALLOW
83
95
  process, not to the caller — it assumes the process belongs to a single client. A server shared
84
96
  across projects would let one project's agent name another project's profile alias and reach its
85
97
  database, `prod` included. One process per project, launched from that project's own config, keeps
86
- each project's agent limited to the profiles that project itself defines.
98
+ each project's agent limited to the profiles that project itself defines — **except** that every
99
+ profile in your global `~/.pg-admin-mcp/config.env` is reachable from every project. Keep production
100
+ profiles out of the global file (or make them read-only there).
87
101
 
88
102
  **With npx (primary)** this is what [Quick start (npx)](#quick-start-npx) already sets up: the client
89
- spawns a fresh `npx -y pg-admin-mcp` per session from the project's own `.mcp.json` + `.env`. The
90
- template is [`examples/per-project/`](examples/per-project/).
103
+ spawns a fresh `npx -y pg-admin-mcp` per session, and the server loads that project's own
104
+ `.pg-mcp.env` (plus your optional global config). With a `.git` or `.mcp.json` at the project root,
105
+ detection stops there, so another project's file above it is not picked up (without a root marker the
106
+ search continues up to the filesystem root). The template is [`examples/per-project/`](examples/per-project/).
91
107
 
92
108
  **With Docker (alternative)** it is one container per project, launched by a small Compose file.
93
109
  Pull the image once — the same image is reused across every project (see [Quick start (Docker, alternative)](#quick-start-docker-alternative)
@@ -152,7 +168,7 @@ services:
152
168
  **`-T`, never `-t`** — the Compose spelling of the same rule as `docker run`: a TTY echoes stdin back
153
169
  onto stdout and corrupts the JSON-RPC frame stream this server relies on.
154
170
 
155
- **The launch directory is load-bearing.** Verified against Claude Code 2.1.220: `CLAUDE_PROJECT_DIR` is
171
+ **For the Docker/Compose flow, the launch directory is load-bearing.** Verified against Claude Code 2.1.220: `CLAUDE_PROJECT_DIR` is
156
172
  not set at the point `.mcp.json` is substituted, so `${CLAUDE_PROJECT_DIR:-.}` always takes its `.`
157
173
  fallback, which resolves against the spawned server's CWD — the directory `claude` was launched from,
158
174
  not the directory `.mcp.json` lives in and not `$HOME`. The dangerous case is not the obvious failure
@@ -169,6 +185,9 @@ Add to the project's `.gitignore`:
169
185
  pg-workspace/
170
186
  ```
171
187
 
188
+ (Config-file discovery — `.pg-mcp.env`, `~/.pg-admin-mcp/config.env` — does not apply inside the
189
+ container; Docker is configured only through its environment.)
190
+
172
191
  The full template — copy-ready files, adding a third profile, the networking table, and how to confirm
173
192
  it worked — lives in [`examples/per-project-docker/`](examples/per-project-docker/); start there rather than
174
193
  retyping any of the above.
@@ -298,10 +317,54 @@ the dry run and the confirm — leaving the primary-key set and the row count id
298
317
  either check. What `keyChecksum` does catch, that `rowCount` alone does not, is *substitution*: one matching
299
318
  row disappearing while a different one starts matching keeps the count identical while changing the key set.
300
319
 
320
+ ## Config files
321
+
322
+ Under npx the server reads two optional files in the `.env` dialect (same keys as
323
+ [Configuration](#configuration) below):
324
+
325
+ - **Global:** `~/.pg-admin-mcp/config.env` (Windows `C:\Users\<you>\.pg-admin-mcp\config.env`).
326
+ - **Project:** `.pg-mcp.env`, searched from the project directory the client reports (MCP roots, then
327
+ `CLAUDE_PROJECT_DIR`, then the server's working directory) and walking up parent by parent. The
328
+ search stops at the first `.pg-mcp.env`, or after a directory that contains `.git` or `.mcp.json`, or
329
+ at the filesystem root. Claude Code 2.1.309 declares the roots capability, answers with the launch
330
+ directory and sets `CLAUDE_PROJECT_DIR`; a launch from `proj/src/deep` finds `proj/.pg-mcp.env` and
331
+ stops at `proj/.git`. Without a `.git` or `.mcp.json` marker the walk continues to the filesystem
332
+ root, so a `.pg-mcp.env` in any ancestor directory could be found.
333
+
334
+ **Trust.** `.pg-mcp.env` is trusted config: it can add profiles, grant capabilities (`PG_<ALIAS>_ALLOW_*`)
335
+ and widen allowed directories. It can also add keys to a profile whose URL comes from your real
336
+ environment — `PG_<ALIAS>_SSL_MODE=disable` would turn TLS off for those credentials — and point
337
+ `PG_MCP_AUDIT_PATH` at any file. Only use it in repositories you trust — a project you clone could ship
338
+ one. Root markers (`.git`, `.mcp.json`) bound the search. `PG_MCP_PG_BIN_DIR` (which binaries
339
+ backup/restore run) is read only from the real environment, the global file or the file you name with
340
+ `PG_MCP_ENV_FILE` — never from a discovered `.pg-mcp.env`. Keys in any config file that do not start
341
+ with `PG_` are ignored.
342
+
343
+ **Merging.** Profiles are the union of `PG_MCP_PROFILES` from the real environment, the project file
344
+ and the global file. A profile comes **whole from one file** — a file owns an alias if it lists it in
345
+ its `PG_MCP_PROFILES` or holds any of its `PG_<ALIAS>_*` keys — and when both files do, the project
346
+ wins with no key mixing. The real environment then overrides per key (except `PG_MCP_PROFILES`, which
347
+ is always the union). Other global `PG_MCP_*` keys: environment > project > global.
348
+
349
+ **Relative paths** in a file (`PG_MCP_ALLOWED_DIRS`, `PG_<ALIAS>_ALLOWED_DIRS`,
350
+ `PG_<ALIAS>_SSL_ROOT_CERT`, `PG_MCP_AUDIT_PATH`, `PG_MCP_PG_BIN_DIR`) resolve against **that file's
351
+ directory**, not the launch directory. Values from the real environment are used as given.
352
+
353
+ **`PG_MCP_ENV_FILE`** (real environment only — a config file cannot set it) replaces project
354
+ discovery with the named file; a relative path is relative to the working directory, and a missing or
355
+ unreadable file makes the server exit 1 at startup. Its relative path values now resolve against its
356
+ own directory, like any other file's.
357
+
358
+ **When it loads.** Once per session, after the client reports its roots. After editing a file,
359
+ reconnect the MCP (`/mcp` in Claude Code); a failed load also persists until you reconnect. With no
360
+ config at all the server still starts, tools return an error with a hint, and
361
+ `postgres_connection_status` reports a `config` section (`startDir`, `startDirSource`, `projectFile`,
362
+ `globalFile`, `globalLoaded`, `envFile`) plus `profilesError`.
363
+
301
364
  ## Configuration
302
365
 
303
- `.env.example` is the full, commented contract — copy it to `.env` and fill it in. The tables below are
304
- what exists, not the full detail.
366
+ The example files in [`examples/`](examples/) are commented templates. The tables below are what exists,
367
+ not the full detail; the key names are the same in the config files, the environment and `docker --env-file`.
305
368
 
306
369
  **Global:**
307
370
 
@@ -309,8 +372,8 @@ what exists, not the full detail.
309
372
  |---|---|
310
373
  | `PG_MCP_PROFILES` | **required** — csv of profile aliases |
311
374
  | `PG_MCP_DEFAULT_PROFILE` | first entry |
312
- | `PG_MCP_ALLOWED_DIRS` | `/workspace` in the image; empty on a bare host run disables file tools. Comma-separated (Windows `D:\…` paths are fine); a relative entry resolves against the launch directory |
313
- | `PG_MCP_ENV_FILE` | unset — path to a dotenv file the server loads at startup (relative = launch directory); keys already in the environment win; unreadable file = exit 1 |
375
+ | `PG_MCP_ALLOWED_DIRS` | `/workspace` in the image; empty on a bare host run disables file tools. Comma-separated (Windows `D:\…` paths are fine); a relative entry resolves against the directory of the file that sets it (the launch directory when it comes from the environment) |
376
+ | `PG_MCP_ENV_FILE` | unset — real environment only; path to a dotenv file that replaces `.pg-mcp.env` discovery (relative = launch directory); unreadable file = exit 1. See [Config files](#config-files) |
314
377
  | `PG_MCP_AUDIT_PATH` | unset — audit logging disabled |
315
378
  | `PG_MCP_AUDIT_PARAMS` | `false` — redact statement params in the audit log |
316
379
  | `PG_MCP_LOG_LEVEL` | `warn` — stderr only, never stdout |
@@ -345,11 +408,13 @@ A broken profile does not stop the server at startup — other profiles stay usa
345
408
  ## Connecting a client
346
409
 
347
410
  Every client below takes the same stdio `command`/`args` shape. **npx (primary):** `"command": "npx"`,
348
- `"args": ["-y", "pg-admin-mcp"]` plus an `env` block — the per-project `.mcp.json` in
349
- [`examples/per-project/`](examples/per-project/) is the complete Claude Code form. On native Windows,
411
+ `"args": ["-y", "pg-admin-mcp"]`; databases come from the [config files](#config-files) (an `env` block
412
+ works too, and wins per key). For Claude Code that is `claude mcp add --scope user pg -- npx -y pg-admin-mcp`
413
+ (see [Quick start](#quick-start-npx)). On native Windows,
350
414
  `npx` is a `.cmd` shim that most clients cannot spawn directly: use `"command": "cmd"`,
351
- `"args": ["/c", "npx", "-y", "pg-admin-mcp"]`. Clients launched outside a project (Claude Desktop) have
352
- no meaningful launch directory, so give `PG_MCP_ENV_FILE` and `PG_MCP_ALLOWED_DIRS` absolute paths there.
415
+ `"args": ["/c", "npx", "-y", "pg-admin-mcp"]`. Clients that report neither roots nor `CLAUDE_PROJECT_DIR` fall back to the server's
416
+ working directory (usually not a project), so in practice only the global file applies there; to use a
417
+ project file, set `PG_MCP_ENV_FILE` to an absolute path.
353
418
 
354
419
  The Docker forms (alternative) follow.
355
420
 
@@ -550,9 +615,13 @@ open to `10001:10001` for anyone who forgets.
550
615
  matching your server's major (Windows `winget install PostgreSQL.PostgreSQL.17`, Debian/Ubuntu
551
616
  `sudo apt install postgresql-client`, macOS `brew install libpq`) and point `PG_MCP_PG_BIN_DIR` at its
552
617
  `bin` if it is not on `PATH` (Windows: `C:\Program Files\PostgreSQL\17\bin`).
553
- - **npx server exits immediately with `PG_MCP_ENV_FILE points to …`.** The `.env` it names does not
618
+ - **npx server exits immediately with `PG_MCP_ENV_FILE points to …`.** The file it names does not
554
619
  exist at that path. A relative path resolves against the directory the client was launched from —
555
- start `claude` from the project root, or make the path absolute.
620
+ make the path absolute.
621
+ - **Tools say no profiles are configured.** Call `postgres_connection_status` and read its `config`
622
+ section: it shows where the search started, which project/global file was found, and `profilesError`.
623
+ Add `~/.pg-admin-mcp/config.env` or a project `.pg-mcp.env`, then reconnect (`/mcp`) — config is read
624
+ once per session, and a failed load persists until you reconnect.
556
625
  - **`pg_dump`/`pg_restore` major-version mismatch.** Archives are forward-only: a client older than the
557
626
  server it dumped from refuses to run, and an archive produced by a newer `pg_dump` cannot be restored by
558
627
  an older `pg_restore`. Use the image tag matching your PostgreSQL major (`:pg17`, `:pg16`, …) —
@@ -573,7 +642,8 @@ Package manager is **pnpm** — never npm.
573
642
 
574
643
  ```bash
575
644
  pnpm install
576
- pnpm check # lint + typecheck + unit tests + build + stdio smoke check
645
+ pnpm check # lint + typecheck + unit tests + build + stdio smoke check + shutdown-drain proof
646
+ # (the drain proof only runs on Linux; elsewhere it prints SKIPPED and passes)
577
647
  pnpm test # unit tests only (no Docker)
578
648
  pnpm test:int # integration tests against a real postgres:17 via testcontainers (needs Docker)
579
649
  RUN_CONTAINER_SMOKE=1 pnpm test:smoke # builds the image and drives it over stdio (needs Docker)
@@ -603,7 +673,9 @@ Personal project. Distributed on npm as `pg-admin-mcp` (`npx -y pg-admin-mcp`);
603
673
  the one in `package.json`. To run unreleased changes, use a clone (`pnpm install && pnpm build`, then
604
674
  `node /absolute/path/to/dist/index.js` as the client `command`). Docker images are
605
675
  built and pushed to Docker Hub as `mrrainx/pg-admin-mcp` (`:pg17`, `:pg16`, `linux/amd64` only) by the
606
- release workflow described in [docs/releasing.md](docs/releasing.md), triggered by pushing a `v*` tag —
607
- if no such tag has been pushed yet, `docker pull` returns `manifest unknown` and
676
+ release workflow described in [docs/releasing.md](docs/releasing.md), triggered by pushing a `v*` tag.
677
+ That push only happens when the repository's Docker Hub secrets are set; without them the Docker legs
678
+ fail on purpose while the npm release still goes out, so the `:pgN` images can lag behind the npm
679
+ version. If `docker pull` returns `manifest unknown`, no Docker release has succeeded yet and
608
680
  [Building the image locally](#building-the-image-locally) is the only way to get the image. No license
609
681
  file yet.
@@ -48,7 +48,8 @@ export function readBool(env, name) {
48
48
  hint: `set ${name} to one of 1/true/yes or 0/false/no`,
49
49
  });
50
50
  }
51
- function splitList(raw) {
51
+ /** The one comma splitter: trimmed, empties dropped, `[]` when `undefined`. */
52
+ export function splitList(raw) {
52
53
  if (raw === undefined)
53
54
  return [];
54
55
  return raw
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
@@ -172,6 +172,9 @@ function buildProfile(alias, env) {
172
172
  toJSON: redacted,
173
173
  };
174
174
  }
175
+ const NOT_SET_HINT = 'define profiles in ~/.pg-admin-mcp/config.env, in a project .pg-mcp.env, or via PG_MCP_PROFILES ' +
176
+ '(a comma-separated list of aliases, e.g. PG_MCP_PROFILES=dev,prod); ' +
177
+ 'postgres_connection_status shows which config files were searched';
175
178
  /** Pure function of its `env` argument — no module-level singleton, so tests never fight shared state. */
176
179
  export function loadProfiles(env = process.env) {
177
180
  const aliases = readCsv(env, 'PG_MCP_PROFILES');
@@ -179,7 +182,7 @@ export function loadProfiles(env = process.env) {
179
182
  throw new PgMcpError({
180
183
  code: 'PROFILE_MISCONFIGURED',
181
184
  message: 'PG_MCP_PROFILES is not set',
182
- hint: 'set PG_MCP_PROFILES to a comma-separated list of profile aliases, e.g. PG_MCP_PROFILES=dev,prod',
185
+ hint: NOT_SET_HINT,
183
186
  });
184
187
  }
185
188
  // Seeded with the reserved global prefix so an alias that normalizes to it
@@ -212,7 +215,7 @@ export function loadProfiles(env = process.env) {
212
215
  throw new PgMcpError({
213
216
  code: 'PROFILE_MISCONFIGURED',
214
217
  message: 'PG_MCP_PROFILES is not set',
215
- hint: 'set PG_MCP_PROFILES to a comma-separated list of profile aliases, e.g. PG_MCP_PROFILES=dev,prod',
218
+ hint: NOT_SET_HINT,
216
219
  });
217
220
  }
218
221
  const defaultAlias = readString(env, 'PG_MCP_DEFAULT_PROFILE') ?? firstAlias;
@@ -1 +1 @@
1
- {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/config/profiles.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/config/profiles.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -7,16 +7,16 @@ import process from 'node:process';
7
7
  import { StdioServerTransport } from '@modelcontextprotocol/server/stdio';
8
8
  import { logger } from './core/logger.js';
9
9
  import { runShutdownHooks } from './core/shutdown.js';
10
- import { loadEnvFile } from './runtime/env-file.js';
10
+ import { readEnvFileLayer } from './runtime/config-layers.js';
11
11
  import { createServer } from './server.js';
12
- /** Hard cap on shutdown. A wedged backend must not keep the container alive. */
12
+ /** Hard cap on shutdown. A wedged backend must not keep the process (or its container) alive. */
13
13
  const SHUTDOWN_TIMEOUT_MS = 2000;
14
- /** Bounded: a client that stopped reading must not keep the container alive. */
14
+ /** Bounded: a client that stopped reading must not keep the process (or its container) alive. */
15
15
  const DRAIN_TIMEOUT_MS = 2000;
16
- // Before createServer(): every env read downstream is lazy, but it must see the
17
- // merged keys. A named-but-unreadable file is fatal — stderr only, never stdout.
16
+ // Fail fast on a named-but-unreadable PG_MCP_ENV_FILE — stderr only, never stdout.
17
+ // Merging is lazy (server.ts loads the layered config on the first call).
18
18
  try {
19
- loadEnvFile();
19
+ readEnvFileLayer(process.env, process.cwd());
20
20
  }
21
21
  catch (err) {
22
22
  // PgMcpError's message already carries its hint.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -80,9 +80,23 @@ export async function readTableResource(uri, variables) {
80
80
  return throwResourceError(err);
81
81
  }
82
82
  }
83
- export function registerResources(server) {
84
- server.registerResource('schemas', new ResourceTemplate('postgres://{profile}/schemas', { list: undefined }), { title: 'Schemas in scope for a profile', mimeType: 'application/json' }, readSchemasResource);
85
- server.registerResource('schema', new ResourceTemplate('postgres://{profile}/schema/{schema}', { list: undefined }), { title: 'Objects in one schema', mimeType: 'application/json' }, readSchemaResource);
86
- server.registerResource('table', new ResourceTemplate('postgres://{profile}/table/{schema}/{table}', { list: undefined }), { title: 'Full detail for one table-like relation', mimeType: 'application/json' }, readTableResource);
83
+ /**
84
+ * `ensureConfigLoaded` runs before any profile lookup so the layered config
85
+ * (global + project files) has landed in `process.env` by then. A load failure
86
+ * is thrown like every other resource error.
87
+ */
88
+ export function registerResources(server, ensureConfigLoaded = () => Promise.resolve()) {
89
+ const afterConfig = (read) => async (uri, variables) => {
90
+ try {
91
+ await ensureConfigLoaded();
92
+ }
93
+ catch (err) {
94
+ return throwResourceError(err);
95
+ }
96
+ return read(uri, variables);
97
+ };
98
+ server.registerResource('schemas', new ResourceTemplate('postgres://{profile}/schemas', { list: undefined }), { title: 'Schemas in scope for a profile', mimeType: 'application/json' }, afterConfig(readSchemasResource));
99
+ server.registerResource('schema', new ResourceTemplate('postgres://{profile}/schema/{schema}', { list: undefined }), { title: 'Objects in one schema', mimeType: 'application/json' }, afterConfig(readSchemaResource));
100
+ server.registerResource('table', new ResourceTemplate('postgres://{profile}/table/{schema}/{table}', { list: undefined }), { title: 'Full detail for one table-like relation', mimeType: 'application/json' }, afterConfig(readTableResource));
87
101
  }
88
102
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,234 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { parseEnv } from 'node:util';
5
+ import { readString, splitList } from '../config/env.js';
6
+ import { PgMcpError, envPrefix } from '../core/errors.js';
7
+ import { logger } from '../core/logger.js';
8
+ /**
9
+ * Config layers for host mode: a global file (`~/.pg-admin-mcp/config.env`) and
10
+ * a per-project file (`.pg-mcp.env`, found by walking up from the project dir),
11
+ * both in the `.env` dialect the server already reads from the environment.
12
+ */
13
+ export const GLOBAL_CONFIG_DIR = '.pg-admin-mcp';
14
+ export const GLOBAL_CONFIG_FILE = 'config.env';
15
+ export const PROJECT_CONFIG_FILE = '.pg-mcp.env';
16
+ /** A directory holding one of these is a project root: the walk-up stops there. */
17
+ export const ROOT_MARKERS = ['.git', '.mcp.json'];
18
+ /** `<home>/.pg-admin-mcp/config.env`. */
19
+ export function globalConfigPath(home) {
20
+ return path.join(home, GLOBAL_CONFIG_DIR, GLOBAL_CONFIG_FILE);
21
+ }
22
+ /**
23
+ * Walks up from `startDir` looking for `.pg-mcp.env`. At each directory the
24
+ * file is checked first (so one next to `.git` counts), then a root marker ends
25
+ * the search — a config above the repo is never picked up. Also stops at the
26
+ * filesystem root. `exists` is injectable for tests.
27
+ */
28
+ export function findProjectConfig(startDir, exists = existsSync) {
29
+ let dir = path.resolve(startDir);
30
+ for (;;) {
31
+ const candidate = path.join(dir, PROJECT_CONFIG_FILE);
32
+ if (exists(candidate))
33
+ return candidate;
34
+ if (ROOT_MARKERS.some((m) => exists(path.join(dir, m))))
35
+ return undefined;
36
+ const parent = path.dirname(dir);
37
+ if (parent === dir)
38
+ return undefined;
39
+ dir = parent;
40
+ }
41
+ }
42
+ /**
43
+ * Reads and parses one config file (`util.parseEnv`, same dialect as Node's
44
+ * `--env-file`). An unreadable file is fatal and names the absolute path —
45
+ * never the contents, which hold passwords.
46
+ */
47
+ export function readLayer(file, read = (p) => readFileSync(p, 'utf8')) {
48
+ const abs = path.resolve(file);
49
+ let contents;
50
+ try {
51
+ contents = read(abs);
52
+ }
53
+ catch (err) {
54
+ throw new PgMcpError({
55
+ code: 'PROFILE_MISCONFIGURED',
56
+ message: `config file ${abs} could not be read`,
57
+ hint: 'fix its permissions or path, or remove the file, then reconnect the MCP server (/mcp in Claude Code) — the config is read once per session',
58
+ cause: err,
59
+ });
60
+ }
61
+ // parseEnv is typed as returning NodeJS.Dict<string>; every value it yields is a string.
62
+ return { file: abs, dir: path.dirname(abs), vars: parseEnv(contents) };
63
+ }
64
+ /**
65
+ * Path-valued keys that are not per-alias. Confirmed against `src/` (readPathList / audit / binaries).
66
+ * `PG_MCP_WORKSPACE_HOST_PATH` is deliberately absent: it is the display-only host
67
+ * path of the container mount (`src/core/paths.ts`), never opened as a file.
68
+ */
69
+ const GLOBAL_PATH_KEYS = new Set(['PG_MCP_ALLOWED_DIRS', 'PG_MCP_AUDIT_PATH', 'PG_MCP_PG_BIN_DIR']);
70
+ /** Comma-list path keys (the rest are single paths). */
71
+ const LIST_SUFFIX = '_ALLOWED_DIRS';
72
+ const ALIAS_PATH_SUFFIXES = [LIST_SUFFIX, '_SSL_ROOT_CERT'];
73
+ function resolveEntry(dir, entry) {
74
+ return path.isAbsolute(entry) ? entry : path.resolve(dir, entry);
75
+ }
76
+ function resolveValue(key, value, dir, owner) {
77
+ const isList = key === 'PG_MCP_ALLOWED_DIRS' || (owner !== undefined && key.endsWith(LIST_SUFFIX));
78
+ if (isList)
79
+ return splitList(value).map((e) => resolveEntry(dir, e)).join(',');
80
+ const isPath = GLOBAL_PATH_KEYS.has(key) || (owner !== undefined && ALIAS_PATH_SUFFIXES.some((s) => key.endsWith(s)));
81
+ return isPath && value.trim() !== '' ? resolveEntry(dir, value.trim()) : value;
82
+ }
83
+ /**
84
+ * Pure merge of the project and global layers onto `env`: returns the keys to
85
+ * ADD (the caller assigns them). Rules (spec 4, R1-R3):
86
+ * - a key already own-present in `env` is never returned, even when empty;
87
+ * - `PG_MCP_PROFILES` is the one exception: the de-duplicated union of env,
88
+ * project and global, returned whenever it differs from env's own value;
89
+ * - a key belongs to the alias with the longest `PG_<ALIAS>_` prefix; an
90
+ * alias is taken whole from the first layer (project, then global) that
91
+ * lists it or holds any of its keys — keys from the other layer are
92
+ * dropped, so nothing mixes;
93
+ * - other keys merge per key, project over global;
94
+ * - files may only set `PG_*` keys, and `PG_MCP_PG_BIN_DIR` never comes from a
95
+ * discovered project file (`projectIsExplicit` false); the file the operator
96
+ * named with `PG_MCP_ENV_FILE` may set it;
97
+ * - relative path values from a file resolve against that file's dir.
98
+ */
99
+ export function mergeLayers(env, project, global, { projectIsExplicit = false } = {}) {
100
+ const layers = [project, global].filter((l) => l !== undefined);
101
+ const aliases = [...new Set([...splitList(env['PG_MCP_PROFILES']), ...layers.flatMap((l) => splitList(l.vars['PG_MCP_PROFILES']))])];
102
+ const prefixes = aliases
103
+ .map((alias) => ({ alias, prefix: `${envPrefix(alias)}_` }))
104
+ .sort((a, b) => b.prefix.length - a.prefix.length);
105
+ const ownerOf = (key) => prefixes.find((p) => key.startsWith(p.prefix))?.alias;
106
+ // A layer owns an alias if it lists it or holds any of its keys (env lists the
107
+ // alias, the file only carries e.g. PG_DEV_URL); when both qualify, project wins.
108
+ const owningLayer = new Map();
109
+ for (const alias of aliases) {
110
+ const found = layers.find((l) => splitList(l.vars['PG_MCP_PROFILES']).includes(alias) || Object.keys(l.vars).some((k) => ownerOf(k) === alias));
111
+ if (found !== undefined)
112
+ owningLayer.set(alias, found);
113
+ }
114
+ const out = {};
115
+ // Global first, project last, so project overwrites for unowned keys.
116
+ for (const l of [...layers].reverse()) {
117
+ for (const [key, value] of Object.entries(l.vars)) {
118
+ // PG_MCP_ENV_FILE is honored only from the real environment (it picks the file itself).
119
+ if (key === 'PG_MCP_PROFILES' || key === 'PG_MCP_ENV_FILE' || Object.hasOwn(env, key))
120
+ continue;
121
+ // Files may only set PG_* keys: a discovered file must not reach LD_PRELOAD, NODE_OPTIONS, PATH...
122
+ if (!key.startsWith('PG_'))
123
+ continue;
124
+ // The binary dir decides which executables backup/restore spawn: real env, the
125
+ // global file or the operator's PG_MCP_ENV_FILE — never a discovered project file.
126
+ if (key === 'PG_MCP_PG_BIN_DIR' && l === project && !projectIsExplicit)
127
+ continue;
128
+ const owner = ownerOf(key);
129
+ if (owner !== undefined && owningLayer.get(owner) !== l)
130
+ continue;
131
+ out[key] = resolveValue(key, value, l.dir, owner);
132
+ }
133
+ }
134
+ const union = aliases.join(',');
135
+ if (union !== '' && union !== env['PG_MCP_PROFILES'])
136
+ out['PG_MCP_PROFILES'] = union;
137
+ return out;
138
+ }
139
+ /** A client that never answers `roots/list` must not stall the first tool call. */
140
+ const LIST_ROOTS_TIMEOUT_MS = 2000;
141
+ /**
142
+ * Where the project walk-up starts: the client's first `file:` root (when it
143
+ * declared the capability and `listRoots` is given), else `CLAUDE_PROJECT_DIR`,
144
+ * else `cwd`. A `listRoots` that throws or exceeds 2000 ms falls back silently.
145
+ */
146
+ export async function resolveStartDir(deps) {
147
+ if (deps.listRoots !== undefined) {
148
+ let timer;
149
+ try {
150
+ const timeout = new Promise((_, reject) => {
151
+ timer = setTimeout(() => {
152
+ reject(new Error(`roots/list timed out after ${LIST_ROOTS_TIMEOUT_MS} ms`));
153
+ }, LIST_ROOTS_TIMEOUT_MS);
154
+ });
155
+ const { roots } = await Promise.race([deps.listRoots(), timeout]);
156
+ for (const root of roots) {
157
+ if (root.uri.startsWith('file:'))
158
+ return { dir: fileURLToPath(root.uri), source: 'roots' };
159
+ }
160
+ }
161
+ catch (err) {
162
+ logger.info('roots/list unavailable, falling back', err instanceof Error ? err.message : String(err));
163
+ }
164
+ finally {
165
+ clearTimeout(timer);
166
+ }
167
+ }
168
+ const fromEnv = readString(deps.env, 'CLAUDE_PROJECT_DIR');
169
+ if (fromEnv !== undefined)
170
+ return { dir: fromEnv, source: 'CLAUDE_PROJECT_DIR' };
171
+ return { dir: deps.cwd, source: 'cwd' };
172
+ }
173
+ /**
174
+ * Reads the file named by `PG_MCP_ENV_FILE` in the real environment (relative
175
+ * paths resolve against `cwd`), or returns `undefined` when it is unset/blank.
176
+ * Also the startup fail-fast check in `index.ts`: a named-but-unreadable
177
+ * secrets file must not boot a server whose every profile fails obscurely.
178
+ * @throws PgMcpError (`PROFILE_MISCONFIGURED`) when the file cannot be read.
179
+ */
180
+ export function readEnvFileLayer(env, cwd, read) {
181
+ const raw = readString(env, 'PG_MCP_ENV_FILE')?.trim();
182
+ if (raw === undefined || raw === '')
183
+ return undefined;
184
+ const file = path.resolve(cwd, raw);
185
+ try {
186
+ return readLayer(file, read);
187
+ }
188
+ catch (err) {
189
+ throw new PgMcpError({
190
+ code: 'PROFILE_MISCONFIGURED',
191
+ message: `PG_MCP_ENV_FILE points to ${file}, which could not be read`,
192
+ hint: 'create the file (template: examples/per-project/.pg-mcp.env.example), fix the path, or unset PG_MCP_ENV_FILE — ' +
193
+ 'a relative path resolves against the directory the MCP client was launched from; ' +
194
+ 'then reconnect the MCP server (/mcp in Claude Code)',
195
+ cause: err,
196
+ });
197
+ }
198
+ }
199
+ let lastReport;
200
+ /** The report of the last `loadConfig`, or `undefined` before the first one. */
201
+ export function getConfigReport() {
202
+ return lastReport;
203
+ }
204
+ /**
205
+ * Impure entry: picks the project layer (`PG_MCP_ENV_FILE`, resolved against
206
+ * `cwd`, else walk-up discovery from the start dir), adds the global layer when
207
+ * its file exists, merges them and assigns the result into `env`.
208
+ * @throws PgMcpError (`PROFILE_MISCONFIGURED`) when a chosen file is unreadable.
209
+ */
210
+ export async function loadConfig(deps) {
211
+ const { env, cwd, home, exists = existsSync, read } = deps;
212
+ const start = await resolveStartDir(deps);
213
+ const explicit = readEnvFileLayer(env, cwd, read);
214
+ const envFile = explicit !== undefined;
215
+ let project = explicit;
216
+ if (!envFile) {
217
+ const found = findProjectConfig(start.dir, exists);
218
+ if (found !== undefined)
219
+ project = readLayer(found, read);
220
+ }
221
+ const globalFile = globalConfigPath(home);
222
+ const global = exists(globalFile) ? readLayer(globalFile, read) : undefined;
223
+ Object.assign(env, mergeLayers(env, project, global, { projectIsExplicit: envFile }));
224
+ lastReport = {
225
+ startDir: start.dir,
226
+ startDirSource: start.source,
227
+ ...(project === undefined ? {} : { projectFile: project.file }),
228
+ globalFile,
229
+ globalLoaded: global !== undefined,
230
+ envFile,
231
+ };
232
+ return lastReport;
233
+ }
234
+ //# sourceMappingURL=config-layers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-layers.js","sourceRoot":"","sources":["../../src/runtime/config-layers.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -1,11 +1,13 @@
1
1
  import { createRequire } from 'node:module';
2
+ import { homedir } from 'node:os';
2
3
  import { performance } from 'node:perf_hooks';
3
4
  import { McpServer } from '@modelcontextprotocol/server';
4
5
  import { loadProfiles } from './config/profiles.js';
5
6
  import { auditLog } from './core/audit.js';
6
7
  import { withAuditContext } from './core/audit-context.js';
7
- import { PgMcpError } from './core/errors.js';
8
+ import { PgMcpError, toToolResult } from './core/errors.js';
8
9
  import { registerResources } from './resources/index.js';
10
+ import { loadConfig } from './runtime/config-layers.js';
9
11
  import { tools } from './tools/index.js';
10
12
  function version() {
11
13
  try {
@@ -52,12 +54,22 @@ function isErrorResult(result) {
52
54
  * into a failed tool call, so a lookup failure here only degrades what gets
53
55
  * audited, never the call itself.
54
56
  */
55
- export function wrapForAudit(tool) {
57
+ export function wrapForAudit(tool, ensureConfigLoaded = () => Promise.resolve()) {
56
58
  return async (args, ctx) => {
57
59
  const start = performance.now();
58
60
  const alias = extractProfileAlias(args);
59
61
  let profile = alias ?? '<default>';
60
62
  let envClass = 'unknown';
63
+ // Layered config must have landed in process.env before ANY profile lookup.
64
+ // A load failure is this call's error result (it names the file), never a crash.
65
+ try {
66
+ await ensureConfigLoaded();
67
+ }
68
+ catch (err) {
69
+ const errorCode = err instanceof PgMcpError ? err.code : 'UNCAUGHT';
70
+ auditLog({ tool: tool.name, profile, envClass, durationMs: performance.now() - start, outcome: 'error', errorCode });
71
+ return toToolResult(err);
72
+ }
61
73
  try {
62
74
  const resolved = loadProfiles().get(alias);
63
75
  profile = resolved.alias;
@@ -89,6 +101,16 @@ export function wrapForAudit(tool) {
89
101
  }
90
102
  };
91
103
  }
104
+ /** Loads the layered config once the client's `roots` capability (known only after `initialize`) can be consulted. */
105
+ async function loadConfigFor(server) {
106
+ const rootsCapable = server.server.getClientCapabilities()?.roots !== undefined;
107
+ await loadConfig({
108
+ env: process.env,
109
+ cwd: process.cwd(),
110
+ home: homedir(),
111
+ ...(rootsCapable ? { listRoots: () => server.server.listRoots() } : {}),
112
+ });
113
+ }
92
114
  export function createServer() {
93
115
  const server = new McpServer({ name: 'pg-admin-mcp', version: version() }, {
94
116
  capabilities: { tools: {}, resources: {} },
@@ -97,10 +119,14 @@ export function createServer() {
97
119
  'Mutating tools are dry-run first: call once to preview, then re-call with `confirm: true` ' +
98
120
  'and the returned `expect` object.',
99
121
  });
122
+ // One load per server, shared by every tool call and resource read. Called
123
+ // lazily so it runs after `initialize` (capabilities are unknown before that).
124
+ let loading;
125
+ const ensureConfigLoaded = () => (loading ??= loadConfigFor(server));
100
126
  for (const tool of tools) {
101
- server.registerTool(tool.name, tool.config, wrapForAudit(tool));
127
+ server.registerTool(tool.name, tool.config, wrapForAudit(tool, ensureConfigLoaded));
102
128
  }
103
- registerResources(server);
129
+ registerResources(server, ensureConfigLoaded);
104
130
  return server;
105
131
  }
106
132
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAGzC,SAAS,OAAO;IACd,IAAI,CAAC;QACH,MAAM,GAAG,GAAY,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACvE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,SAAS,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACnG,OAAO,GAAG,CAAC,OAAO,CAAC;QACrB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,yJAAyJ;AACzJ,SAAS,mBAAmB,CAAC,IAAa;IACxC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED,kIAAkI;AAClI,SAAS,gBAAgB,CAAC,MAA4C;IACpE,IAAI,CAAC,CAAC,mBAAmB,IAAI,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACvD,MAAM,iBAAiB,GAAY,MAAM,CAAC,iBAAiB,CAAC;IAC5D,IAAI,OAAO,iBAAiB,KAAK,QAAQ,IAAI,iBAAiB,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,iBAAiB,CAAC,EAAE,CAAC;QAC1G,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC;IACpC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC;AAED,SAAS,aAAa,CAAC,MAA4C;IACjE,OAAO,SAAS,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;AACxD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,IAAa;IACxC,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QACzB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,OAAO,GAAG,KAAK,IAAI,WAAW,CAAC;QACnC,IAAI,QAAQ,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC;YACzB,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,oFAAoF;QACtF,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YAC5F,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;YACvD,QAAQ,CAAC;gBACP,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO;gBACP,QAAQ;gBACR,UAAU;gBACV,OAAO;gBACP,GAAG,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,GAAG,WAAW;aACf,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAC7C,MAAM,SAAS,GAAG,GAAG,YAAY,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;YACpE,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YAC1F,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAC5C;QACE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QAC1C,YAAY,EACV,oFAAoF;YACpF,0FAA0F;YAC1F,4FAA4F;YAC5F,mCAAmC;KACtC,CACF,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import { formatOutcome } from '../core/format.js';
5
5
  import { getCurrentRoleInfo } from '../db/catalog.js';
6
6
  import { withSession } from '../db/session.js';
7
7
  import { PG_BINARIES, requireBinary } from '../runtime/binaries.js';
8
+ import { getConfigReport } from '../runtime/config-layers.js';
8
9
  import { runtimeReport } from '../runtime/environment.js';
9
10
  import { defineTool } from './_shared.js';
10
11
  /**
@@ -114,7 +115,25 @@ export const connectionStatusTool = defineTool('postgres_connection_status', {
114
115
  },
115
116
  }, async (args) => {
116
117
  try {
117
- const registry = loadProfiles();
118
+ const config = getConfigReport() ?? null;
119
+ let registry;
120
+ try {
121
+ registry = loadProfiles();
122
+ }
123
+ catch (err) {
124
+ // No usable profile set (e.g. PG_MCP_PROFILES unset): this is exactly when the
125
+ // searched config paths matter, so report them alongside the error instead of throwing.
126
+ const e = err instanceof PgMcpError ? err : fromPgError(err);
127
+ return formatOutcome({
128
+ kind: 'report',
129
+ data: {
130
+ config,
131
+ binaries: await binaryReport(),
132
+ profilesError: { code: e.code, message: e.message, hint: e.hint },
133
+ profiles: [],
134
+ },
135
+ });
136
+ }
118
137
  const aliases = args.profile !== undefined
119
138
  ? [args.profile]
120
139
  : Array.from(new Set([...registry.list().map((p) => p.alias), ...registry.errors.keys()]));
@@ -129,7 +148,10 @@ export const connectionStatusTool = defineTool('postgres_connection_status', {
129
148
  return buildStatus(alias, undefined, err instanceof PgMcpError ? err : fromPgError(err));
130
149
  }
131
150
  }));
132
- return formatOutcome({ kind: 'report', data: { binaries: await binaryReport(), profiles: statuses } });
151
+ return formatOutcome({
152
+ kind: 'report',
153
+ data: { config, binaries: await binaryReport(), profiles: statuses },
154
+ });
133
155
  }
134
156
  catch (err) {
135
157
  return toToolResult(err);
@@ -1 +1 @@
1
- {"version":3,"file":"connection_status.js","sourceRoot":"","sources":["../../src/tools/connection_status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connection_status.js","sourceRoot":"","sources":["../../src/tools/connection_status.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pg-admin-mcp",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "PostgreSQL administration MCP server (stdio) — run with npx or as a Docker image",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,62 +0,0 @@
1
- import { readFileSync } from 'node:fs';
2
- import path from 'node:path';
3
- import process from 'node:process';
4
- import { parseEnv } from 'node:util';
5
- import { readString } from '../config/env.js';
6
- import { PgMcpError } from '../core/errors.js';
7
- /**
8
- * Optional `.env` file loading for host mode (`npx pg-admin-mcp`).
9
- *
10
- * In the container, Compose / `docker run --env-file` already turn a `.env`
11
- * into real environment variables. A host run has no such launcher, and MCP
12
- * client configs (`.mcp.json`) are usually committed — so secrets need a place
13
- * that is not that file. `PG_MCP_ENV_FILE` names it.
14
- *
15
- * **The real environment wins.** A key already present in `env` — even as an
16
- * empty string — is never overwritten by the file. That makes the committed
17
- * client config authoritative for every key it sets, and the file a fallback
18
- * for whatever it leaves out (typically just the `PG_<ALIAS>_URL` lines that
19
- * carry passwords). Same precedence as Node's own `--env-file`.
20
- *
21
- * A relative path resolves against `cwd` — for an MCP client that is the
22
- * directory the client was launched from, not wherever its config file lives.
23
- *
24
- * Parsing is `util.parseEnv` (Node >= 20.12): stdlib, the same dotenv dialect
25
- * Node's `--env-file` understands, no new dependency.
26
- *
27
- * Mutates `env` in place rather than returning a copy because the rest of the
28
- * server reads `process.env` lazily, per call (`loadProfiles()` runs inside each
29
- * tool handler) — the merge has to land where those reads look. Tests inject a
30
- * plain object instead, so they never touch the real `process.env`.
31
- *
32
- * @returns the absolute path that was loaded, or `undefined` when
33
- * `PG_MCP_ENV_FILE` is unset/blank (a no-op).
34
- * @throws PgMcpError (`PROFILE_MISCONFIGURED`) when the file cannot be read.
35
- * Deliberately fatal: a named-but-missing secrets file would otherwise boot a
36
- * server whose every profile fails later with a far less obvious error.
37
- */
38
- export function loadEnvFile(env = process.env, cwd = process.cwd()) {
39
- const raw = readString(env, 'PG_MCP_ENV_FILE')?.trim();
40
- if (raw === undefined || raw === '')
41
- return undefined;
42
- const file = path.resolve(cwd, raw);
43
- let contents;
44
- try {
45
- contents = readFileSync(file, 'utf8');
46
- }
47
- catch (err) {
48
- throw new PgMcpError({
49
- code: 'PROFILE_MISCONFIGURED',
50
- message: `PG_MCP_ENV_FILE points to ${file}, which could not be read`,
51
- hint: 'create the file (e.g. copy .env.example to .env), fix the path, or unset PG_MCP_ENV_FILE — ' +
52
- 'a relative path resolves against the directory the MCP client was launched from',
53
- cause: err,
54
- });
55
- }
56
- for (const [key, value] of Object.entries(parseEnv(contents))) {
57
- if (!Object.hasOwn(env, key))
58
- env[key] = value;
59
- }
60
- return file;
61
- }
62
- //# sourceMappingURL=env-file.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"env-file.js","sourceRoot":"","sources":["../../src/runtime/env-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,WAAW,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IAC3F,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,iBAAiB,CAAC,EAAE,IAAI,EAAE,CAAC;IACvD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAEtD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpC,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,UAAU,CAAC;YACnB,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,6BAA6B,IAAI,2BAA2B;YACrE,IAAI,EACF,6FAA6F;gBAC7F,iFAAiF;YACnF,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}