pg-admin-mcp 0.1.0 → 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 +107 -35
- package/dist/config/env.js +2 -1
- package/dist/config/env.js.map +1 -1
- package/dist/config/profiles.js +5 -2
- package/dist/config/profiles.js.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/resources/index.js +18 -4
- package/dist/resources/index.js.map +1 -1
- package/dist/runtime/config-layers.js +234 -0
- package/dist/runtime/config-layers.js.map +1 -0
- package/dist/server.js +30 -4
- package/dist/server.js.map +1 -1
- package/dist/tools/connection_status.js +24 -2
- package/dist/tools/connection_status.js.map +1 -1
- package/dist/tools/execute_sql.js +16 -2
- package/dist/tools/execute_sql.js.map +1 -1
- package/package.json +2 -2
- package/dist/runtime/env-file.js +0 -62
- package/dist/runtime/env-file.js.map +0 -1
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. **
|
|
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
|
-
|
|
32
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
90
|
-
|
|
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
|
-
**
|
|
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.
|
|
@@ -199,7 +218,7 @@ All tool names are prefixed `postgres_`. "Capability flag" is the `PG_<ALIAS>_AL
|
|
|
199
218
|
|
|
200
219
|
| Tool | What it does | Capability flag |
|
|
201
220
|
|---|---|---|
|
|
202
|
-
| `postgres_execute_sql` | Arbitrary parameterized SQL — reads always work; `INSERT`/`UPDATE`/`DELETE`/`MERGE` need `ALLOW_WRITE`, `CREATE`/`ALTER`/`DROP`/`TRUNCATE` additionally need `ALLOW_DDL`, `GRANT`/`REVOKE` need `ALLOW_ADMIN`. Mutating statements go through dry-run/confirm. | `ALLOW_WRITE` / `ALLOW_DDL` / `ALLOW_ADMIN` (statement-dependent) |
|
|
221
|
+
| `postgres_execute_sql` | Arbitrary parameterized SQL — reads always work; `INSERT`/`UPDATE`/`DELETE`/`MERGE` need `ALLOW_WRITE`, `CREATE`/`ALTER`/`DROP`/`TRUNCATE`, `COMMENT ON`, `SECURITY LABEL`, `REFRESH MATERIALIZED VIEW`, `CALL` and `DO` additionally need `ALLOW_DDL`, `GRANT`/`REVOKE` need `ALLOW_ADMIN`. `VACUUM` cannot run inside a transaction — use `postgres_admin`'s `maintenance_vacuum`. Mutating statements go through dry-run/confirm. | `ALLOW_WRITE` / `ALLOW_DDL` / `ALLOW_ADMIN` (statement-dependent) |
|
|
203
222
|
| `postgres_insert_batch` | Bulk `INSERT` — set-based `INSERT … SELECT * FROM unnest()`, switching to a bulk strategy above a row threshold. Confirmed on row count alone (no pre-existing rows to checksum). | `ALLOW_WRITE` |
|
|
204
223
|
| `postgres_update_batch` | Filtered bulk `UPDATE`. `where` is a structured, parameterized filter and is mandatory — an empty filter is refused before any SQL reaches the server. Dry-run/confirm. | `ALLOW_WRITE` |
|
|
205
224
|
| `postgres_delete_batch` | Filtered bulk `DELETE`, same mandatory-`where` rule as update. Dry-run/confirm. | `ALLOW_WRITE` |
|
|
@@ -245,7 +264,7 @@ per-profile opt-in:
|
|
|
245
264
|
| Flag | Unlocks |
|
|
246
265
|
|---|---|
|
|
247
266
|
| `PG_<ALIAS>_ALLOW_WRITE` | `INSERT`/`UPDATE`/`DELETE`/`MERGE` via `postgres_execute_sql`; `postgres_insert_batch` / `update_batch` / `delete_batch`; `postgres_copy` import direction |
|
|
248
|
-
| `PG_<ALIAS>_ALLOW_DDL` | `CREATE`/`ALTER`/`DROP`/`TRUNCATE` via `postgres_execute_sql` |
|
|
267
|
+
| `PG_<ALIAS>_ALLOW_DDL` | `CREATE`/`ALTER`/`DROP`/`TRUNCATE`, `COMMENT ON`, `SECURITY LABEL`, `REFRESH MATERIALIZED VIEW`, `CALL` and `DO` via `postgres_execute_sql` |
|
|
249
268
|
| `PG_<ALIAS>_ALLOW_ADMIN` | `postgres_admin`'s mutating sub-ops (roles, grants, extensions, sessions, maintenance) and `GRANT`/`REVOKE` via `postgres_execute_sql` |
|
|
250
269
|
| `PG_<ALIAS>_ALLOW_EXPLAIN_ANALYZE` | `postgres_explain` with `analyze:true` (this actually executes the statement) |
|
|
251
270
|
| `PG_<ALIAS>_ALLOW_BACKUP` | `postgres_backup` |
|
|
@@ -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
|
-
|
|
304
|
-
|
|
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
|
|
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"]
|
|
349
|
-
|
|
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
|
|
352
|
-
|
|
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
|
|
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
|
-
|
|
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)
|
|
@@ -599,11 +669,13 @@ See [docs/releasing.md](docs/releasing.md) for how a tagged commit turns this in
|
|
|
599
669
|
|
|
600
670
|
## Status
|
|
601
671
|
|
|
602
|
-
Personal project
|
|
603
|
-
|
|
604
|
-
|
|
672
|
+
Personal project. Distributed on npm as `pg-admin-mcp` (`npx -y pg-admin-mcp`); the current version is
|
|
673
|
+
the one in `package.json`. To run unreleased changes, use a clone (`pnpm install && pnpm build`, then
|
|
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
|
-
|
|
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.
|
package/dist/config/env.js
CHANGED
|
@@ -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
|
-
|
|
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
|
package/dist/config/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAsB/C,oEAAoE;AACpE,MAAM,UAAU,UAAU,CAAC,GAAsB,EAAE,IAAY,EAAE,QAAiB;IAChF,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,GAAsB,EAAE,IAAY,EAAE,IAAoB;IAChF,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC;IAEzD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,UAAU,CAAC;YACnB,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,GAAG,IAAI,2BAA2B,GAAG,GAAG;YACjD,IAAI,EAAE,OAAO,IAAI,4BAA4B,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE;SACpE,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,GAAG,MAAM,CAAC;IACnB,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG;QAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC;IACjE,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG;QAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC;IACjE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAClD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAEvD;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAsB,EAAE,IAAY;IAC3D,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,MAAM,IAAI,UAAU,CAAC;QACnB,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EAAE,GAAG,IAAI,4BAA4B,GAAG,GAAG;QAClD,IAAI,EAAE,OAAO,IAAI,qCAAqC;KACvD,CAAC,CAAC;AACL,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
|
package/dist/config/profiles.js
CHANGED
|
@@ -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:
|
|
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:
|
|
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 {
|
|
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
|
-
//
|
|
17
|
-
//
|
|
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
|
-
|
|
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":";AACA,4EAA4E;AAC5E,iFAAiF;AACjF,yDAAyD;AACzD,OAAO,wBAAwB,CAAC;AAEhC,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/resources/index.js
CHANGED
|
@@ -80,9 +80,23 @@ export async function readTableResource(uri, variables) {
|
|
|
80
80
|
return throwResourceError(err);
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C;;;;GAIG;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AACjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC;AAC/C,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAAC;AACjD,mFAAmF;AACnF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,WAAW,CAAU,CAAC;AAE3D,yCAAyC;AACzC,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;AAChE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,SAAiC,UAAU;IAC7F,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,SAAS,CAAC;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;QACtD,IAAI,MAAM,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QACxC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,SAAS,CAAC;QACrC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AASD;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,OAA8B,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC;IAClG,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,UAAU,CAAC;YACnB,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,eAAe,GAAG,oBAAoB;YAC/C,IAAI,EAAE,4IAA4I;YAClJ,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;IACL,CAAC;IACD,yFAAyF;IACzF,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAA2B,EAAE,CAAC;AACnG,CAAC;AAED;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,CAAC;AACpG,wDAAwD;AACxD,MAAM,WAAW,GAAG,eAAe,CAAC;AACpC,MAAM,mBAAmB,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;AAE5D,SAAS,YAAY,CAAC,GAAW,EAAE,KAAa;IAC9C,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,KAAa,EAAE,GAAW,EAAE,KAAyB;IACtF,MAAM,MAAM,GAAG,GAAG,KAAK,qBAAqB,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IACnG,IAAI,MAAM;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/E,MAAM,MAAM,GACV,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzG,OAAO,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACjF,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,WAAW,CACzB,GAAsB,EACtB,OAAqB,EACrB,MAAoB,EACpB,EAAE,iBAAiB,GAAG,KAAK,KAAsC,EAAE;IAEnE,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrI,MAAM,QAAQ,GAAG,OAAO;SACrB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;SAC3D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,CAAC,GAAW,EAAsB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC;IAE3G,+EAA+E;IAC/E,kFAAkF;IAClF,MAAM,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAC;IACnD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CACvB,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CACrH,CAAC;QACF,IAAI,KAAK,KAAK,SAAS;YAAE,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,sEAAsE;IACtE,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACtC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAClD,wFAAwF;YACxF,IAAI,GAAG,KAAK,iBAAiB,IAAI,GAAG,KAAK,iBAAiB,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;gBAAE,SAAS;YAChG,mGAAmG;YACnG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;gBAAE,SAAS;YACrC,+EAA+E;YAC/E,mFAAmF;YACnF,IAAI,GAAG,KAAK,mBAAmB,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,iBAAiB;gBAAE,SAAS;YACjF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,KAAK,KAAK,SAAS,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,SAAS;YAClE,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,GAAG,CAAC,iBAAiB,CAAC;QAAE,GAAG,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC;IACrF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mFAAmF;AACnF,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAUnC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAyB;IAC7D,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,KAAiC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC/C,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBACtB,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,qBAAqB,KAAK,CAAC,CAAC,CAAC;gBAC9E,CAAC,EAAE,qBAAqB,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;YAClE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;oBAAE,OAAO,EAAE,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YAC7F,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACxG,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IAC3D,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IACjF,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC1C,CAAC;AAmBD;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAsB,EACtB,GAAW,EACX,IAA4B;IAE5B,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;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,UAAU,CAAC;YACnB,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,6BAA6B,IAAI,2BAA2B;YACrE,IAAI,EACF,iHAAiH;gBACjH,mFAAmF;gBACnF,qDAAqD;YACvD,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,IAAI,UAAoC,CAAC;AAEzC,gFAAgF;AAChF,MAAM,UAAU,eAAe;IAC7B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAoB;IACnD,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAE1C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,QAAQ,KAAK,SAAS,CAAC;IACvC,IAAI,OAAO,GAAG,QAAQ,CAAC;IACvB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACnD,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5E,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACtF,UAAU,GAAG;QACX,QAAQ,EAAE,KAAK,CAAC,GAAG;QACnB,cAAc,EAAE,KAAK,CAAC,MAAM;QAC5B,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/D,UAAU;QACV,YAAY,EAAE,MAAM,KAAK,SAAS;QAClC,OAAO;KACR,CAAC;IACF,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
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
|
package/dist/server.js.map
CHANGED
|
@@ -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;
|
|
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
|
|
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({
|
|
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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,oFAAoF,CAAC;CAClG,CAAC,CAAC;AAiDH,+FAA+F;AAC/F,KAAK,UAAU,eAAe,CAAC,OAAgB;IAC7C,OAAO,WAAW,CAChB,OAAO,EACP,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QAED,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,IAAI,EAAE;gBACJ,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B;SACF,CAAC;IACJ,CAAC,EACD,EAAE,SAAS,EAAE,mBAAmB,EAAE,CACnC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,YAAY;IACzB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAC7B,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAU,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,EAAE,mBAAmB,GAAG,YAAY,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAU,CAAC;QAClG,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IACF,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,aAAa,CAAC,aAAiC;IACtD,OAAO,EAAE,OAAO,EAAE,aAAa,KAAK,SAAS,EAAE,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;AACnH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAAa,EAAE,OAA4B,EAAE,SAAiC;IACvG,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC,OAAO,CAAC;IAExC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,SAAS,IAAI,IAAI,UAAU,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,qBAAqB,KAAK,GAAG,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,CAAC;QAC5I,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;IACxG,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG;QACZ,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,WAAW,EAAE,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC;QAClD,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1G,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IACjI,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAC5C,4BAA4B,EAC5B;IACE,KAAK,EAAE,8BAA8B;IACrC,WAAW,EACT,wHAAwH;QACxH,iGAAiG;QACjG,+GAA+G;QAC/G,6GAA6G;IAC/G,WAAW;IACX,WAAW,EAAE;QACX,YAAY,EAAE,IAAI;QAClB,eAAe,EAAE,KAAK;QACtB,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;KACpB;CACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,eAAe,EAAE,IAAI,IAAI,CAAC;QACzC,IAAI,QAAyC,CAAC;QAC9C,IAAI,CAAC;YACH,QAAQ,GAAG,YAAY,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,+EAA+E;YAC/E,wFAAwF;YACxF,MAAM,CAAC,GAAG,GAAG,YAAY,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,aAAa,CAAC;gBACnB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE;oBACJ,MAAM;oBACN,QAAQ,EAAE,MAAM,YAAY,EAAE;oBAC9B,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;oBACjE,QAAQ,EAAE,EAAE;iBACb;aACF,CAAC,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GACX,IAAI,CAAC,OAAO,KAAK,SAAS;YACxB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YAChB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/F,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAA0B,EAAE;YAClD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC7C,IAAI,SAAS,KAAK,SAAS;gBAAE,OAAO,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YAC7E,IAAI,CAAC;gBACH,OAAO,MAAM,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;YAClE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,YAAY,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,YAAY,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;SACrE,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC,CACF,CAAC"}
|
|
@@ -71,7 +71,15 @@ import { defineTool, profileParam } from './_shared.js';
|
|
|
71
71
|
* - DDL (`CREATE`/`ALTER`/`DROP`/`TRUNCATE`) needs `ddl` **on top of** `write`.
|
|
72
72
|
* `ALLOW_WRITE` is the master switch for this tool's write path; `ALLOW_DDL`
|
|
73
73
|
* is the second key for the statements that can destroy a schema rather than
|
|
74
|
-
* rows.
|
|
74
|
+
* rows. Catalog metadata (`COMMENT`, `SECURITY LABEL`) and
|
|
75
|
+
* `REFRESH MATERIALIZED VIEW` sit here too.
|
|
76
|
+
* - `CALL` and `DO` also need `ddl`: a procedure or an anonymous block can run
|
|
77
|
+
* any statement inside it, DDL included, and nothing short of executing it
|
|
78
|
+
* says which — so `ALLOW_WRITE` alone must not be the way around `ALLOW_DDL`.
|
|
79
|
+
* - Anything left off this table runs inside a read-only transaction, so a
|
|
80
|
+
* writing keyword missing from it is never a hole, only a statement that can
|
|
81
|
+
* never run (PostgreSQL answers 25006) — which is how the entries above got
|
|
82
|
+
* here.
|
|
75
83
|
* - `GRANT`/`REVOKE` need `admin`, again on top of `write`. Changing who may
|
|
76
84
|
* read a table is not DDL and is not an ordinary write.
|
|
77
85
|
* - **Transaction control** (`BEGIN`, `COMMIT`, `ROLLBACK`, `END`, `ABORT`,
|
|
@@ -193,6 +201,11 @@ const WRITE_PATH_CAPABILITY = {
|
|
|
193
201
|
ALTER: 'ddl',
|
|
194
202
|
DROP: 'ddl',
|
|
195
203
|
TRUNCATE: 'ddl',
|
|
204
|
+
COMMENT: 'ddl',
|
|
205
|
+
SECURITY: 'ddl',
|
|
206
|
+
REFRESH: 'ddl',
|
|
207
|
+
CALL: 'ddl',
|
|
208
|
+
DO: 'ddl',
|
|
196
209
|
GRANT: 'admin',
|
|
197
210
|
REVOKE: 'admin',
|
|
198
211
|
...Object.fromEntries(TX_CONTROL_KEYWORDS.map((keyword) => [keyword, 'write'])),
|
|
@@ -329,7 +342,8 @@ export const executeSqlTool = defineTool('postgres_execute_sql', {
|
|
|
329
342
|
'hands out no cursor, so put LIMIT/OFFSET (with an ORDER BY) in your own SQL to read past the cap. WRITES: a ' +
|
|
330
343
|
'statement whose leading keyword is INSERT/UPDATE/DELETE/MERGE takes the guarded write path when the profile ' +
|
|
331
344
|
'sets PG_<ALIAS>_ALLOW_WRITE=true; UPDATE and DELETE must carry a WHERE clause that references a real column. ' +
|
|
332
|
-
'CREATE/ALTER/DROP/TRUNCATE
|
|
345
|
+
'CREATE/ALTER/DROP/TRUNCATE, COMMENT ON, SECURITY LABEL, REFRESH MATERIALIZED VIEW, CALL and DO additionally ' +
|
|
346
|
+
'need PG_<ALIAS>_ALLOW_DDL=true, and GRANT/REVOKE need ' +
|
|
333
347
|
'PG_<ALIAS>_ALLOW_ADMIN=true. A DDL DRY RUN CANNOT REPORT A ROW COUNT — PostgreSQL returns none for DDL, so a ' +
|
|
334
348
|
'dry-run "0 rows" on a DROP TABLE means "not applicable", never "nothing will happen"; the dry run proves only ' +
|
|
335
349
|
'that the statement parses, resolves and is permitted, and says nothing about how many rows it destroys or ' +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute_sql.js","sourceRoot":"","sources":["../../src/tools/execute_sql.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAiC,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,4BAA4B,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACrG,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,YAAY,EAA6B,MAAM,cAAc,CAAC;AAEnF
|
|
1
|
+
{"version":3,"file":"execute_sql.js","sourceRoot":"","sources":["../../src/tools/execute_sql.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.
|
|
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": {
|
|
@@ -45,4 +45,4 @@
|
|
|
45
45
|
"typescript-eslint": "^8.65.0",
|
|
46
46
|
"vitest": "^4.1.10"
|
|
47
47
|
}
|
|
48
|
-
}
|
|
48
|
+
}
|
package/dist/runtime/env-file.js
DELETED
|
@@ -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"}
|