@nifrajs/mcp-db 5.1.0 → 5.3.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/CHANGELOG.md ADDED
@@ -0,0 +1,390 @@
1
+ # @nifrajs/mcp-db
2
+
3
+ ## 5.3.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 48c9895: A query through a partial SQLite index whose `WHERE` names a masked column is now refused like any other read of that column. Choosing the index proves its predicate for every row it yields, so `SELECT count(*) FROM users WHERE password_hash LIKE 'h%'` could answer the masked predicate through an existing partial index without the bytecode ever reading the column.
8
+ - @nifrajs/mcp@5.3.0
9
+ - 9fbb84e: A query that walks an index on a masked column in key order is refused like any other read of that column. `ORDER BY <masked column>` served by its index never read or compared the column, so it was admitted and returned rows ranked by the masked value.
10
+
11
+ ## 5.2.1
12
+
13
+ ### Patch Changes
14
+
15
+ - @nifrajs/mcp@5.2.1
16
+
17
+ ## 5.2.0
18
+
19
+ ### Patch Changes
20
+
21
+ - 9498cf8: The package ships its `CHANGELOG.md`, so the installed package has the notes for every version, as the GitHub release does. Before, the tarball held only the code, `README.md`, `LICENSE` and `package.json`.
22
+ - Updated dependencies [9498cf8]
23
+ - @nifrajs/mcp@5.2.0
24
+
25
+ ## 5.1.0
26
+
27
+ ### Patch Changes
28
+
29
+ - abb4354: The package now ships the MIT `LICENSE` text, as every other @nifrajs package already did.
30
+ - Updated dependencies [abb4354]
31
+ - @nifrajs/mcp@5.1.0
32
+
33
+ ## 5.0.0
34
+
35
+ ### Patch Changes
36
+
37
+ - 5b17850: `run_query` no longer materializes oversized results before applying `maxResultBytes`. A text or blob cell longer than the budget arrives as `"<n bytes>"` instead of being copied out of SQLite, and rows stop being read once their cells pass the budget. Before, `SELECT zeroblob(2000000) FROM t` over 100 rows held about 2 GB and ran for over a minute before the byte cap applied. A result cut by the byte budget reports `total: null` unless `exactTotal` is on.
38
+ - e58690c: `explainPostgres` refuses a query that uses a masked column, as `queryPostgres` does, with `NIFRA_DB_COLUMN_REFUSED`, with or without `analyze`. Before, a plan's row counts and estimates for a filter such as `WHERE password_hash LIKE 'h%'` answered questions about the column. A plain `SELECT password_hash FROM users` is refused as well.
39
+ - 5377b66: `run_query` checks the tables the compiled statement opens, not only the names the SQL and the query plan use. A query is refused when it reads an unexposed table through a schema-qualified name beside a CTE of the same name, through any alias (non-ASCII ones included), through `x IN table`, or as a same-named table in a temp or attached schema of the connection.
40
+ - 437d3cd: `postgresRoleSql` and `nifra db-role` grant the role `SELECT` on each allowed schema only. On Postgres 14 and later, with nothing excluded, the role used to get `pg_read_all_data`, which reads every schema in the database whatever `schemas` named.
41
+ - cd07938: `run_query` refuses every query that opens a virtual table or a table-valued function, as documented, however the query names it. A `pragma_*` function or `dbstat` listed after a comma under an allowlisted alias used to pass the checks and return schema metadata of tables outside the allowlist.
42
+ - Updated dependencies [1af7543]
43
+ - @nifrajs/mcp@5.0.0
44
+
45
+ ## 4.0.2
46
+
47
+ ### Patch Changes
48
+
49
+ - @nifrajs/mcp@4.0.2
50
+
51
+ ## 4.0.1
52
+
53
+ ### Patch Changes
54
+
55
+ - @nifrajs/mcp@4.0.1
56
+
57
+ ## 4.0.0
58
+
59
+ ### Minor Changes
60
+
61
+ - d4d40a5: feat(mcp): `allowedHosts` DNS-rebinding guard
62
+
63
+ `createMcpServer()`, `respondMcpHttp()`, and `serveDatabaseAsMcp()` accept `allowedHosts`. A
64
+ request whose Host is not listed gets 403, with or without an Origin. Set it for servers on
65
+ localhost or a private network, where a DNS-rebound page presents a matching Origin. The check reads
66
+ the inbound `Host` header. Host names compare case-insensitively, an entry without a port matches any
67
+ port, and an entry with a port matches the effective port, so `localhost:80` admits
68
+ `http://localhost/`.
69
+
70
+ The same-origin default now accepts an `https:` Origin on an `http:` request URL (a TLS-terminating
71
+ proxy) and still rejects a downgrade.
72
+
73
+ - 37dff1d: The read-only SQLite engine is importable on its own from `@nifrajs/mcp-db/engine`.
74
+
75
+ - `openReadOnlySqlite` opens a file with the `readonly` flag and `PRAGMA query_only = ON`, and opens a WAL database that no writer has attached yet without making it writable.
76
+ - `querySqlite`, `explainSqlite` and `readSqliteSchema` take an `exclude` list. A query is one SELECT (or WITH ... SELECT), and every table its compiled statement opens must be exposed, so a view, a CTE or an alias cannot reach an excluded table.
77
+ - With a `redaction` option, a query that reads a column `redaction.column` matches is refused (`NIFRA_DB_COLUMN_REFUSED`), whether it selects the column under another name, wraps it in an expression, filters on it or reaches it through a view or an index. Results are capped by rows and bytes and JSON-safe (bigints beyond 2^53 as strings, blobs as `<n bytes>`).
78
+ - Every refusal is a `DbRefusal` with a stable `NIFRA_DB_*` code, a message, a fix and a docs anchor.
79
+
80
+ `serveDatabaseAsMcp` behaves as before.
81
+
82
+ - d4a79de: `@nifrajs/mcp-db/postgres` reads a development Postgres database on `Bun.SQL`, with the result shape and `NIFRA_DB_*` refusal codes of the SQLite engine.
83
+
84
+ - `parsePostgresUrl` and `connectPostgres` connect only to loopback, `*.localhost` or a unix socket unless `allowHosts` names the host, and start every session read-only.
85
+ - `queryPostgres` runs one statement through a tokenizer (one read-only statement, no row locks, no functions that reach outside a query), a `BEGIN READ ONLY` transaction with statement, lock and idle timeouts, a role gate (superusers and server-file or server-program roles are refused), an extension gate (dblink, postgres_fdw, file_fdw and untrusted languages, unless `allowExtensions` names them), a `DECLARE CURSOR` that the server accepts only for SELECT and VALUES, and a plan-level check that every relation, its parent tables and every catalog function in FROM are in `schemas` and outside `exclude`. With `redaction`, a column `redaction.column` matches that any plan expression uses, or a whole row holding one, is refused (`NIFRA_DB_COLUMN_REFUSED`).
86
+ - `explainPostgres` returns the JSON plan, and with `analyze` executes it inside the same transaction and timeout.
87
+ - `readPostgresSchema` lists the readable tables and views with columns, keys, indexes and row estimates, and leaves out an excluded table along with the views and child tables that read it.
88
+ - `postgresRoleSql` writes the SQL for a read-only login role, `pg_read_all_data` on Postgres 14 and later or `GRANT SELECT` per schema with a `REVOKE` per excluded table and partition, and runs none of it.
89
+
90
+ ### Patch Changes
91
+
92
+ - 0f486f2: Closing a connection from `openReadOnlySqlite` releases the database file right away, instead of when its statements are garbage collected.
93
+ - Updated dependencies [d4d40a5]
94
+ - Updated dependencies [9ccf198]
95
+ - @nifrajs/mcp@4.0.0
96
+
97
+ ## 3.5.0
98
+
99
+ ### Patch Changes
100
+
101
+ - 6046984: Close fresh security and correctness gaps in table allowlists, ISR/cache behavior, streamed response capture, idempotency ownership, and canonical redirects.
102
+ - @nifrajs/mcp@3.5.0
103
+
104
+ ## 3.4.0
105
+
106
+ ### Patch Changes
107
+
108
+ - Updated dependencies [8d23613]
109
+ - Updated dependencies
110
+ - @nifrajs/mcp@3.4.0
111
+
112
+ ## 3.3.0
113
+
114
+ ### Patch Changes
115
+
116
+ - @nifrajs/mcp@3.3.0
117
+
118
+ ## 3.2.0
119
+
120
+ ### Patch Changes
121
+
122
+ - f34a050: Record the pending source changes for these packages in their release notes so fixed-version publishing does not omit their changelog entries.
123
+ - Updated dependencies [1a041a9]
124
+ - Updated dependencies [cefedc2]
125
+ - @nifrajs/mcp@3.2.0
126
+
127
+ ## 3.1.0
128
+
129
+ ### Patch Changes
130
+
131
+ - @nifrajs/mcp@3.1.0
132
+
133
+ ## 3.0.0
134
+
135
+ ### Patch Changes
136
+
137
+ - @nifrajs/mcp@3.0.0
138
+
139
+ ## 2.14.1
140
+
141
+ ### Patch Changes
142
+
143
+ - @nifrajs/mcp@2.14.1
144
+
145
+ ## 2.14.0
146
+
147
+ ### Patch Changes
148
+
149
+ - @nifrajs/mcp@2.14.0
150
+
151
+ ## 2.13.0
152
+
153
+ ### Patch Changes
154
+
155
+ - @nifrajs/mcp@2.13.0
156
+
157
+ ## 2.12.1
158
+
159
+ ### Patch Changes
160
+
161
+ - @nifrajs/mcp@2.12.1
162
+
163
+ ## 2.12.0
164
+
165
+ ### Minor Changes
166
+
167
+ - 81b1579: `run_query` now bounds what one call can cost. `queryTimeoutMs` (default 5 seconds) covers planning,
168
+ execution, and the optional count; `maxConcurrentQueries` (default 1) rejects calls that arrive
169
+ while the lane is busy. Row truncation no longer counts the full result to report a total: the
170
+ response carries `truncated: true` with `total: null`, and an exact total is opt-in per server via
171
+ `exactTotal`, which re-runs the query as a count.
172
+
173
+ Where the query runs depends on the database, and the difference is visible in the timeout it can
174
+ enforce. A file-backed database is reopened read-only in a worker that is spawned once, reused for
175
+ every call, and terminated when a deadline passes - so a runaway statement is stopped, and no call
176
+ copies the database. An in-memory database has no file to reopen and runs on the serving thread,
177
+ where a synchronous statement cannot be preempted; there the deadline still bounds the response but
178
+ is only observed once the statement returns. `SqliteDatabaseLike` gained an optional `filename` to
179
+ express that difference; any database shaped like it keeps working either way.
180
+
181
+ ### Patch Changes
182
+
183
+ - 18c8301: The table allowlist is now checked against the SQL the query actually names, not only against SQLite's
184
+ query plan. A plan row reports the alias as its scan target, so `FROM "users" AS habits` planned as
185
+ `SCAN habits` and passed an allowlist that exposed `habits` but not `users`. A small tokenizer now
186
+ reads every relation after `FROM`/`JOIN` before the query runs - it handles all four SQLite identifier
187
+ quotings and the keyword-adjacent form (`FROM"users"`) a whitespace-anchored pattern cannot, drops
188
+ string literals and comments so text can never be read as SQL, and excludes CTE names. The plan check
189
+ still runs afterwards, and now resolves a schema-qualified `SCAN main.habits` to `habits` rather than
190
+ rejecting it as a table named `main`.
191
+
192
+ `maxResultBytes` is enforced on the encoded UTF-8 byte length of the whole payload, envelope included,
193
+ rather than on the JS string length of the rows alone - a multi-byte result could exceed the cap it
194
+ had just been measured against. A payload still over the cap after halving down to zero rows is an
195
+ error rather than an oversized response.
196
+
197
+ Authorization moves onto `@nifrajs/mcp`'s new `authorizeMessage` seam, so a `run_query` call is
198
+ authorized from the message the server already parsed instead of from a second `request.clone().json()`
199
+ read of the body.
200
+
201
+ - Updated dependencies [cb04de8]
202
+ - Updated dependencies [f3cc02e]
203
+ - Updated dependencies [e2d1939]
204
+ - @nifrajs/mcp@2.12.0
205
+
206
+ ## 2.11.0
207
+
208
+ ### Patch Changes
209
+
210
+ - @nifrajs/mcp@2.11.0
211
+
212
+ ## 2.10.0
213
+
214
+ ### Patch Changes
215
+
216
+ - @nifrajs/mcp@2.10.0
217
+
218
+ ## 2.9.1
219
+
220
+ ### Patch Changes
221
+
222
+ - @nifrajs/mcp@2.9.1
223
+
224
+ ## 2.9.0
225
+
226
+ ### Patch Changes
227
+
228
+ - @nifrajs/mcp@2.9.0
229
+
230
+ ## 2.8.2
231
+
232
+ ### Patch Changes
233
+
234
+ - f7d68e8: Numeric limit options (body/payload byte caps, TTLs, cache sizes, concurrency, ISR revalidate windows) are now validated at construction and throw a `RangeError` on non-finite or out-of-range values instead of silently disabling the bound - a `NaN` cap previously made `size > max` comparisons fail open. JWT `requiredClaims` now checks own properties only, so inherited names like `toString` no longer satisfy a required claim. `@nifrajs/mcp-db` gates multi-statement input with a real tokenizer, bounds `run_query` materialization to `maxRows + 1` via a wrapping subquery, and skips SQLite planner pseudo-nodes when verifying the table allowlist. `nifra scaffold` refuses to write through symlinked route directories.
235
+ - Updated dependencies [f7d68e8]
236
+ - @nifrajs/mcp@2.8.2
237
+
238
+ ## 2.8.1
239
+
240
+ ### Patch Changes
241
+
242
+ - @nifrajs/mcp@2.8.1
243
+
244
+ ## 2.8.0
245
+
246
+ ### Patch Changes
247
+
248
+ - @nifrajs/mcp@2.8.0
249
+
250
+ ## 2.7.1
251
+
252
+ ### Patch Changes
253
+
254
+ - @nifrajs/mcp@2.7.1
255
+
256
+ ## 2.7.0
257
+
258
+ ### Patch Changes
259
+
260
+ - @nifrajs/mcp@2.7.0
261
+
262
+ ## 2.6.1
263
+
264
+ ### Patch Changes
265
+
266
+ - @nifrajs/mcp@2.6.1
267
+
268
+ ## 2.6.0
269
+
270
+ ### Patch Changes
271
+
272
+ - Updated dependencies [10fb70c]
273
+ - @nifrajs/mcp@2.6.0
274
+
275
+ ## 2.5.0
276
+
277
+ ### Patch Changes
278
+
279
+ - Updated dependencies [3731c69]
280
+ - Updated dependencies [0740f77]
281
+ - @nifrajs/mcp@2.5.0
282
+
283
+ ## 2.4.0
284
+
285
+ ### Patch Changes
286
+
287
+ - @nifrajs/mcp@2.4.0
288
+
289
+ ## 2.3.0
290
+
291
+ ### Patch Changes
292
+
293
+ - ea0a27f: A durable table prefix cannot collide after PostgreSQL truncates it.
294
+
295
+ **Breaking for prefixes longer than 45 characters**, which now fail at construction rather than later.
296
+ PostgreSQL truncates identifiers to 63 bytes, and this adapter appends up to `_records_reconcile` (18)
297
+ to the prefix. Two distinct prefixes long enough to be cut short became one table name, silently
298
+ sharing state between what the caller believed were separate deployments. The accepted length now
299
+ reserves the longest suffix, so an accepted prefix survives truncation intact.
300
+
301
+ Both adapters also assemble their statements through a tagged template that validates every
302
+ substitution as an identifier at the boundary, so the check is at the seam rather than trusted from a
303
+ caller several frames up.
304
+
305
+ - @nifrajs/mcp@2.3.0
306
+
307
+ ## 2.2.0
308
+
309
+ ### Patch Changes
310
+
311
+ - @nifrajs/mcp@2.2.0
312
+
313
+ ## 2.1.0
314
+
315
+ ### Patch Changes
316
+
317
+ - @nifrajs/mcp@2.1.0
318
+
319
+ ## 2.0.0
320
+
321
+ ### Patch Changes
322
+
323
+ - Updated dependencies [d91a45b]
324
+ - Updated dependencies [202e758]
325
+ - @nifrajs/mcp@2.0.0
326
+
327
+ ## 1.13.0
328
+
329
+ ### Patch Changes
330
+
331
+ - @nifrajs/mcp@1.13.0
332
+
333
+ ## 1.12.0
334
+
335
+ ### Patch Changes
336
+
337
+ - @nifrajs/mcp@1.12.0
338
+
339
+ ## 1.11.0
340
+
341
+ ### Patch Changes
342
+
343
+ - @nifrajs/mcp@1.11.0
344
+
345
+ ## 1.10.0
346
+
347
+ ### Patch Changes
348
+
349
+ - @nifrajs/mcp@1.10.0
350
+
351
+ ## 1.9.1
352
+
353
+ ### Patch Changes
354
+
355
+ - Updated dependencies [3eb27ae]
356
+ - @nifrajs/mcp@1.9.1
357
+
358
+ ## 1.9.0
359
+
360
+ ### Patch Changes
361
+
362
+ - @nifrajs/mcp@1.9.0
363
+
364
+ ## 1.8.0
365
+
366
+ ### Patch Changes
367
+
368
+ - @nifrajs/mcp@1.8.0
369
+
370
+ ## 1.7.0
371
+
372
+ ### Patch Changes
373
+
374
+ - @nifrajs/mcp@1.7.0
375
+
376
+ ## 1.6.0
377
+
378
+ ### Patch Changes
379
+
380
+ - @nifrajs/mcp@1.6.0
381
+
382
+ ## 1.5.0
383
+
384
+ ### Minor Changes
385
+
386
+ - 79ac481: Two new agent-native packages. `@nifrajs/prompt`: type-safe prompts over any LLM provider - bind an instruction to input/output Standard Schemas, hand the output schema to the provider as its structured-output format, and get a validated, typed result (provider-neutral `complete` fn, markdown-fence tolerance, bounded `heal` retries). `@nifrajs/mcp-db`: serve a SQLite database as a fail-closed MCP server - allowlisted `list_tables`/`describe_table` by default; opt-in `run_query` requires an authorize hook and enforces read-only in layers (engine `PRAGMA query_only`, single-statement + SELECT-only gates, `EXPLAIN QUERY PLAN` allowlist verification, row/byte caps with truncation markers).
387
+
388
+ ### Patch Changes
389
+
390
+ - @nifrajs/mcp@1.5.0
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAG1C,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,MAAM,EACX,KAAK,cAAc,EAKnB,KAAK,gBAAgB,EAGtB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,MAAM,EACX,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,SAAS,EACT,UAAU,EACV,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,SAAS,EACT,UAAU,EACV,qBAAqB,GACtB,MAAM,sBAAsB,CAAA;AAW7B;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,SAAS,MAAM,EAAO,GACjC,MAAM,GAAG,SAAS,CAuBpB;AAwCD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CA8BxE;AAED,kGAAkG;AAClG,wBAAgB,eAAe,CAC7B,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAC7B,OAAO,GAAE,SAAS,MAAM,EAAO,GAC9B;IAAE,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,CAS9E;AAkCD,iEAAiE;AACjE,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D,kEAAkE;IAClE,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC;AAuPD;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,kBAAkB,GAC1B,MAAM,GAAG,SAAS,CAYpB;AAED,2FAA2F;AAC3F,wBAAgB,aAAa,CAC3B,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,SAAS,GAAG,gBAAgB,CAAC,GAC9D,MAAM,GAAG,SAAS,CAuBpB;AAmBD,4CAA4C;AAC5C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,wCAAwC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAA;CACjC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAC7B,OAAO,GAAE,mBAAwB,GAChC,cAAc,GAAG,SAAS,CA2F5B"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAG1C,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,MAAM,EACX,KAAK,cAAc,EAKnB,KAAK,gBAAgB,EAGtB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,MAAM,EACX,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,SAAS,EACT,UAAU,EACV,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,SAAS,EACT,UAAU,EACV,qBAAqB,GACtB,MAAM,sBAAsB,CAAA;AAW7B;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,SAAS,MAAM,EAAO,GACjC,MAAM,GAAG,SAAS,CAuBpB;AAwCD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CA8BxE;AAED,kGAAkG;AAClG,wBAAgB,eAAe,CAC7B,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAC7B,OAAO,GAAE,SAAS,MAAM,EAAO,GAC9B;IAAE,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,CAS9E;AAkCD,iEAAiE;AACjE,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D,kEAAkE;IAClE,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC;AA2QD;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,kBAAkB,GAC1B,MAAM,GAAG,SAAS,CAYpB;AAED,2FAA2F;AAC3F,wBAAgB,aAAa,CAC3B,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,SAAS,GAAG,gBAAgB,CAAC,GAC9D,MAAM,GAAG,SAAS,CAuBpB;AAmBD,4CAA4C;AAC5C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,wCAAwC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAA;CACjC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAC7B,OAAO,GAAE,mBAAwB,GAChC,cAAc,GAAG,SAAS,CA2F5B"}
package/dist/engine.js CHANGED
@@ -221,6 +221,9 @@ const KEY_COMPARE_OPCODES = new Set([
221
221
  "IfNoHope",
222
222
  ]);
223
223
  const ROWID_OPCODES = new Set(["Rowid", "SeekRowid", "NotExists", "IdxRowid"]);
224
+ // Each steps a cursor in key order, so the rows it yields are ranked by every key field: an index
225
+ // walked for `ORDER BY <column>` leaks the order of a column it never reads or compares.
226
+ const KEY_ORDER_OPCODES = new Set(["Rewind", "Last", "Next", "Prev"]);
224
227
  /**
225
228
  * The record layout behind a cursor on `entry`, from SQLite's own catalog. A rowid table stores its
226
229
  * non-virtual columns in order, then its virtual ones; a WITHOUT ROWID table and an index store the
@@ -259,13 +262,19 @@ function cursorLayout(db, entry) {
259
262
  ...columns.filter((column) => Number(column.hidden) !== 2),
260
263
  ...columns.filter((column) => Number(column.hidden) === 2),
261
264
  ];
262
- return { table: entry.table, fields: stored.map((column) => [column.name]), keyCount: 0, rowid };
265
+ return {
266
+ table: entry.table,
267
+ fields: stored.map((column) => [column.name]),
268
+ keyCount: 0,
269
+ rowid,
270
+ predicate: [],
271
+ };
263
272
  }
264
273
  // A substring match can only over-count: an expression field then reads one column too many.
265
274
  const source = (entry.sql ?? "").toLowerCase();
266
- const named = columns
267
- .map((column) => column.name)
268
- .filter((name) => source.includes(name.toLowerCase()));
275
+ const namedIn = (text) => columns.map((column) => column.name).filter((name) => text.includes(name.toLowerCase()));
276
+ const named = namedIn(source);
277
+ const where = /\bwhere\b/.exec(source);
269
278
  const xinfo = db
270
279
  .prepare("SELECT cid, name, key FROM pragma_index_xinfo(?) ORDER BY seqno")
271
280
  .all(index);
@@ -280,6 +289,7 @@ function cursorLayout(db, entry) {
280
289
  : named),
281
290
  keyCount: xinfo.filter((field) => Number(field.key) === 1).length,
282
291
  rowid,
292
+ predicate: where === null ? [] : namedIn(source.slice(where.index)),
283
293
  };
284
294
  }
285
295
  /**
@@ -290,7 +300,8 @@ function cursorLayout(db, entry) {
290
300
  * (`pragma_*`, `dbstat`, `json_each`) is never exposed.
291
301
  *
292
302
  * With `masked`, also every masked column a cursor on a table or index yields (`Column`), compares
293
- * (a seek or index range check, so a filter counts) or reads as the rowid. Values the statement
303
+ * (a seek or index range check, so a filter counts), orders by (stepping an index in key order) or
304
+ * reads as the rowid. Values the statement
294
305
  * derives from those reads live in other cursors and registers, so an alias or an expression
295
306
  * cannot hide the column it started from.
296
307
  */
@@ -321,6 +332,12 @@ function bytecodeReads(db, query, masked) {
321
332
  }
322
333
  if (masked === undefined)
323
334
  return { tables: [...reads], masked: [] };
335
+ const hits = new Set();
336
+ const read = (layout, names) => {
337
+ for (const name of names)
338
+ if (masked(name))
339
+ hits.add(`${layout.table}.${name}`);
340
+ };
324
341
  const layouts = new Map();
325
342
  const layoutOf = (cursor) => {
326
343
  const entry = cursors.get(cursor);
@@ -330,15 +347,10 @@ function bytecodeReads(db, query, masked) {
330
347
  if (layout === undefined) {
331
348
  layout = cursorLayout(db, entry);
332
349
  layouts.set(cursor, layout);
350
+ read(layout, layout.predicate);
333
351
  }
334
352
  return layout;
335
353
  };
336
- const hits = new Set();
337
- const read = (layout, names) => {
338
- for (const name of names)
339
- if (masked(name))
340
- hits.add(`${layout.table}.${name}`);
341
- };
342
354
  for (const step of program) {
343
355
  const layout = layoutOf(Number(step.p1));
344
356
  if (layout === undefined)
@@ -351,6 +363,10 @@ function bytecodeReads(db, query, masked) {
351
363
  for (const field of layout.fields.slice(0, compared))
352
364
  read(layout, field);
353
365
  }
366
+ else if (KEY_ORDER_OPCODES.has(step.opcode)) {
367
+ for (const field of layout.fields.slice(0, layout.keyCount))
368
+ read(layout, field);
369
+ }
354
370
  else if (ROWID_OPCODES.has(step.opcode) && layout.rowid !== undefined) {
355
371
  read(layout, [layout.rowid]);
356
372
  }
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nifrajs/mcp-db",
3
- "version": "5.1.0",
3
+ "version": "5.3.0",
4
4
  "description": "Serve a SQLite database as a fail-closed MCP server - allowlisted schema tools by default, opt-in read-only queries with plan verification.",
5
5
  "keywords": [
6
6
  "bun",
@@ -37,7 +37,8 @@
37
37
  },
38
38
  "files": [
39
39
  "dist",
40
- "src"
40
+ "src",
41
+ "CHANGELOG.md"
41
42
  ],
42
43
  "sideEffects": false,
43
44
  "scripts": {
@@ -48,7 +49,7 @@
48
49
  "access": "public"
49
50
  },
50
51
  "dependencies": {
51
- "@nifrajs/mcp": "5.1.0"
52
+ "@nifrajs/mcp": "5.3.0"
52
53
  },
53
54
  "repository": {
54
55
  "type": "git",
package/src/engine.ts CHANGED
@@ -300,6 +300,9 @@ const KEY_COMPARE_OPCODES = new Set([
300
300
  "IfNoHope",
301
301
  ])
302
302
  const ROWID_OPCODES = new Set(["Rowid", "SeekRowid", "NotExists", "IdxRowid"])
303
+ // Each steps a cursor in key order, so the rows it yields are ranked by every key field: an index
304
+ // walked for `ORDER BY <column>` leaks the order of a column it never reads or compares.
305
+ const KEY_ORDER_OPCODES = new Set(["Rewind", "Last", "Next", "Prev"])
303
306
 
304
307
  interface BytecodeReads {
305
308
  readonly tables: readonly string[]
@@ -329,6 +332,11 @@ interface CursorLayout {
329
332
  readonly keyCount: number
330
333
  /** The INTEGER PRIMARY KEY column the rowid is, if the table has one. */
331
334
  readonly rowid: string | undefined
335
+ /**
336
+ * The columns a partial index's WHERE names. Every row the index yields satisfies it, so opening
337
+ * the index filters on them as surely as reading them would.
338
+ */
339
+ readonly predicate: readonly string[]
332
340
  }
333
341
 
334
342
  /**
@@ -380,13 +388,20 @@ function cursorLayout(db: Pick<Database, "prepare">, entry: CatalogEntry): Curso
380
388
  ...columns.filter((column) => Number(column.hidden) !== 2),
381
389
  ...columns.filter((column) => Number(column.hidden) === 2),
382
390
  ]
383
- return { table: entry.table, fields: stored.map((column) => [column.name]), keyCount: 0, rowid }
391
+ return {
392
+ table: entry.table,
393
+ fields: stored.map((column) => [column.name]),
394
+ keyCount: 0,
395
+ rowid,
396
+ predicate: [],
397
+ }
384
398
  }
385
399
  // A substring match can only over-count: an expression field then reads one column too many.
386
400
  const source = (entry.sql ?? "").toLowerCase()
387
- const named = columns
388
- .map((column) => column.name)
389
- .filter((name) => source.includes(name.toLowerCase()))
401
+ const namedIn = (text: string): string[] =>
402
+ columns.map((column) => column.name).filter((name) => text.includes(name.toLowerCase()))
403
+ const named = namedIn(source)
404
+ const where = /\bwhere\b/.exec(source)
390
405
  const xinfo = db
391
406
  .prepare<{ cid: number | bigint; name: string | null; key: number | bigint }, [string]>(
392
407
  "SELECT cid, name, key FROM pragma_index_xinfo(?) ORDER BY seqno",
@@ -405,6 +420,7 @@ function cursorLayout(db: Pick<Database, "prepare">, entry: CatalogEntry): Curso
405
420
  ),
406
421
  keyCount: xinfo.filter((field) => Number(field.key) === 1).length,
407
422
  rowid,
423
+ predicate: where === null ? [] : namedIn(source.slice(where.index)),
408
424
  }
409
425
  }
410
426
 
@@ -416,7 +432,8 @@ function cursorLayout(db: Pick<Database, "prepare">, entry: CatalogEntry): Curso
416
432
  * (`pragma_*`, `dbstat`, `json_each`) is never exposed.
417
433
  *
418
434
  * With `masked`, also every masked column a cursor on a table or index yields (`Column`), compares
419
- * (a seek or index range check, so a filter counts) or reads as the rowid. Values the statement
435
+ * (a seek or index range check, so a filter counts), orders by (stepping an index in key order) or
436
+ * reads as the rowid. Values the statement
420
437
  * derives from those reads live in other cursors and registers, so an alias or an expression
421
438
  * cannot hide the column it started from.
422
439
  */
@@ -452,6 +469,10 @@ function bytecodeReads(
452
469
  }
453
470
  if (masked === undefined) return { tables: [...reads], masked: [] }
454
471
 
472
+ const hits = new Set<string>()
473
+ const read = (layout: CursorLayout, names: readonly string[]): void => {
474
+ for (const name of names) if (masked(name)) hits.add(`${layout.table}.${name}`)
475
+ }
455
476
  const layouts = new Map<number, CursorLayout>()
456
477
  const layoutOf = (cursor: number): CursorLayout | undefined => {
457
478
  const entry = cursors.get(cursor)
@@ -460,13 +481,10 @@ function bytecodeReads(
460
481
  if (layout === undefined) {
461
482
  layout = cursorLayout(db, entry)
462
483
  layouts.set(cursor, layout)
484
+ read(layout, layout.predicate)
463
485
  }
464
486
  return layout
465
487
  }
466
- const hits = new Set<string>()
467
- const read = (layout: CursorLayout, names: readonly string[]): void => {
468
- for (const name of names) if (masked(name)) hits.add(`${layout.table}.${name}`)
469
- }
470
488
  for (const step of program) {
471
489
  const layout = layoutOf(Number(step.p1))
472
490
  if (layout === undefined) continue
@@ -475,6 +493,8 @@ function bytecodeReads(
475
493
  const count = Number(step.p4)
476
494
  const compared = Number.isInteger(count) && count > 0 ? count : layout.keyCount
477
495
  for (const field of layout.fields.slice(0, compared)) read(layout, field)
496
+ } else if (KEY_ORDER_OPCODES.has(step.opcode)) {
497
+ for (const field of layout.fields.slice(0, layout.keyCount)) read(layout, field)
478
498
  } else if (ROWID_OPCODES.has(step.opcode) && layout.rowid !== undefined) {
479
499
  read(layout, [layout.rowid])
480
500
  }