db-mcp 4.0.0 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -25
- package/dist/.tsbuildinfo +1 -1
- package/dist/adapters/database-adapter.d.ts +9 -0
- package/dist/adapters/database-adapter.d.ts.map +1 -1
- package/dist/adapters/sqlite/query-executor.d.ts.map +1 -1
- package/dist/adapters/sqlite/read-write-lock.d.ts +49 -0
- package/dist/adapters/sqlite/read-write-lock.d.ts.map +1 -0
- package/dist/adapters/sqlite/schemas/admin.d.ts +5 -5
- package/dist/adapters/sqlite/schemas/admin.d.ts.map +1 -1
- package/dist/adapters/sqlite/schemas/core.d.ts +94 -0
- package/dist/adapters/sqlite/schemas/core.d.ts.map +1 -1
- package/dist/adapters/sqlite/schemas/introspection.d.ts +8 -7
- package/dist/adapters/sqlite/schemas/introspection.d.ts.map +1 -1
- package/dist/adapters/sqlite/schemas/migration.d.ts +2 -2
- package/dist/adapters/sqlite/schemas/migration.d.ts.map +1 -1
- package/dist/adapters/sqlite/sqlite-adapter.d.ts +6 -0
- package/dist/adapters/sqlite/sqlite-adapter.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/admin/backup/create.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/admin/backup/dump.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/admin/backup/restore.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/admin/pragma.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/admin/verify.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/codemode.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/core/convenience.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/core/index.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/core/queries.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/core/versioning.d.ts +19 -0
- package/dist/adapters/sqlite/tools/core/versioning.d.ts.map +1 -0
- package/dist/adapters/sqlite/tools/introspection/graph/tools.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/json-operations/crud.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/migration/helpers.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/vector/metadata.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/vector/search.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/vector/storage.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/virtual/vtable/analyze-csv.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/virtual/vtable/csv.d.ts.map +1 -1
- package/dist/adapters/sqlite/tools/virtual/vtable/info.d.ts.map +1 -1
- package/dist/adapters/sqlite/types.d.ts +1 -1
- package/dist/adapters/sqlite/types.d.ts.map +1 -1
- package/dist/adapters/sqlite-native/index.d.ts +1 -1
- package/dist/adapters/sqlite-native/index.d.ts.map +1 -1
- package/dist/adapters/sqlite-native/tools/window/helpers.d.ts +52 -0
- package/dist/adapters/sqlite-native/tools/window/helpers.d.ts.map +1 -0
- package/dist/adapters/sqlite-native/tools/window/index.d.ts +7 -0
- package/dist/adapters/sqlite-native/tools/window/index.d.ts.map +1 -0
- package/dist/adapters/sqlite-native/tools/window/lag-lead.d.ts +7 -0
- package/dist/adapters/sqlite-native/tools/window/lag-lead.d.ts.map +1 -0
- package/dist/adapters/sqlite-native/tools/window/moving-average.d.ts +7 -0
- package/dist/adapters/sqlite-native/tools/window/moving-average.d.ts.map +1 -0
- package/dist/adapters/sqlite-native/tools/window/ntile.d.ts +7 -0
- package/dist/adapters/sqlite-native/tools/window/ntile.d.ts.map +1 -0
- package/dist/adapters/sqlite-native/tools/window/rank.d.ts +7 -0
- package/dist/adapters/sqlite-native/tools/window/rank.d.ts.map +1 -0
- package/dist/adapters/sqlite-native/tools/window/row-number.d.ts +7 -0
- package/dist/adapters/sqlite-native/tools/window/row-number.d.ts.map +1 -0
- package/dist/adapters/sqlite-native/tools/window/running-total.d.ts +7 -0
- package/dist/adapters/sqlite-native/tools/window/running-total.d.ts.map +1 -0
- package/dist/adapters/sqlite-native/tools/window/schemas.d.ts +159 -0
- package/dist/adapters/sqlite-native/tools/window/schemas.d.ts.map +1 -0
- package/dist/adapters/sqlite-native/transaction-methods.d.ts.map +1 -1
- package/dist/audit/logger.d.ts.map +1 -1
- package/dist/auth/authorization-server-discovery.d.ts.map +1 -1
- package/dist/auth/scopes/mapping.d.ts.map +1 -1
- package/dist/auth/token-validator.d.ts.map +1 -1
- package/dist/{chunk-EQF3WZHX.js → chunk-27C5EE6U.js} +15 -2
- package/dist/{chunk-R5M4WKDM.js → chunk-2TYICG7B.js} +381 -185
- package/dist/{chunk-TGE7LFAR.js → chunk-UE7GVOBV.js} +1069 -355
- package/dist/{chunk-NIC5Z2CA.js → chunk-WYBUO4FL.js} +394 -381
- package/dist/{chunk-Y57WFKAP.js → chunk-XLIYO3YA.js} +178 -72
- package/dist/cli.js +18 -6
- package/dist/codemode/api-constants.d.ts.map +1 -1
- package/dist/codemode/api.d.ts.map +1 -1
- package/dist/codemode/sandbox-factory.d.ts.map +1 -1
- package/dist/codemode/sandbox.d.ts +0 -3
- package/dist/codemode/sandbox.d.ts.map +1 -1
- package/dist/codemode/security.d.ts.map +1 -1
- package/dist/codemode/types.d.ts +2 -0
- package/dist/codemode/types.d.ts.map +1 -1
- package/dist/constants/server-instructions.d.ts.map +1 -1
- package/dist/filtering/tool-constants.d.ts +5 -5
- package/dist/filtering/tool-constants.d.ts.map +1 -1
- package/dist/{http-2WGR3E5K.js → http-2XDGZF4F.js} +177 -32
- package/dist/index.js +4 -4
- package/dist/observability/system-db.d.ts.map +1 -1
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/registration/admin-tools.d.ts.map +1 -1
- package/dist/server/registration/audit-tools/backup.d.ts +8 -0
- package/dist/server/registration/audit-tools/backup.d.ts.map +1 -0
- package/dist/server/registration/audit-tools/helpers.d.ts +11 -0
- package/dist/server/registration/audit-tools/helpers.d.ts.map +1 -0
- package/dist/server/registration/audit-tools/index.d.ts +4 -0
- package/dist/server/registration/audit-tools/index.d.ts.map +1 -0
- package/dist/server/registration/audit-tools/resource.d.ts +8 -0
- package/dist/server/registration/audit-tools/resource.d.ts.map +1 -0
- package/dist/server/registration/audit-tools/search.d.ts +7 -0
- package/dist/server/registration/audit-tools/search.d.ts.map +1 -0
- package/dist/server/registration/index.d.ts +1 -1
- package/dist/server/registration/index.d.ts.map +1 -1
- package/dist/{sqlite-D4WCNPU4.js → sqlite-XWZPEZJO.js} +192 -19
- package/dist/{sqlite-native-DLVS2T52.js → sqlite-native-5GQ3WKCZ.js} +156 -117
- package/dist/transports/http/middleware.d.ts.map +1 -1
- package/dist/transports/http/oauth.d.ts.map +1 -1
- package/dist/transports/http/sessions/legacy-sse.d.ts.map +1 -1
- package/dist/transports/http/sessions/stateful.d.ts +5 -1
- package/dist/transports/http/sessions/stateful.d.ts.map +1 -1
- package/dist/transports/http/transport.d.ts +2 -0
- package/dist/transports/http/transport.d.ts.map +1 -1
- package/dist/transports/http/types.d.ts +9 -0
- package/dist/transports/http/types.d.ts.map +1 -1
- package/dist/types/auth.d.ts +4 -0
- package/dist/types/auth.d.ts.map +1 -1
- package/dist/types/server.d.ts +3 -0
- package/dist/types/server.d.ts.map +1 -1
- package/dist/utils/annotations.d.ts +8 -0
- package/dist/utils/annotations.d.ts.map +1 -1
- package/dist/utils/errors/categories.d.ts +16 -11
- package/dist/utils/errors/categories.d.ts.map +1 -1
- package/dist/utils/errors/classes.d.ts +37 -0
- package/dist/utils/errors/classes.d.ts.map +1 -1
- package/dist/utils/errors/format.d.ts +2 -2
- package/dist/utils/errors/format.d.ts.map +1 -1
- package/dist/utils/errors/index.d.ts +1 -1
- package/dist/utils/errors/index.d.ts.map +1 -1
- package/dist/utils/errors/suggestions.d.ts +1 -0
- package/dist/utils/errors/suggestions.d.ts.map +1 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/security-utils.d.ts +29 -0
- package/dist/utils/security-utils.d.ts.map +1 -0
- package/dist/utils/stream-utils.d.ts +14 -0
- package/dist/utils/stream-utils.d.ts.map +1 -0
- package/dist/utils/where-clause.d.ts +0 -13
- package/dist/utils/where-clause.d.ts.map +1 -1
- package/package.json +36 -39
- package/dist/adapters/sqlite-native/tools/window.d.ts +0 -7
- package/dist/adapters/sqlite-native/tools/window.d.ts.map +0 -1
- package/dist/server/registration/audit-tools.d.ts +0 -17
- package/dist/server/registration/audit-tools.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-factory.d.ts","sourceRoot":"","sources":["../../src/codemode/sandbox-factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"sandbox-factory.d.ts","sourceRoot":"","sources":["../../src/codemode/sandbox-factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG7E;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC;AAEpC;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,OAAO,CACL,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,SAAS,IAAI,OAAO,CAAC;IACrB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,IAAI,IAAI,CAAC;IACnB,OAAO,CACL,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,QAAQ,IAAI;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAKD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAK7D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,CAEnD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,WAAW,EAAE,CAExD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,IAAI,CAAC,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,QAAQ,CASV;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,CAAC,EAAE,WAAW,EAClB,WAAW,CAAC,EAAE,WAAW,EACzB,cAAc,CAAC,EAAE,cAAc,GAC9B,YAAY,CASd;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,eAAe,CAQtE"}
|
|
@@ -6,9 +6,6 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type ivm from "isolated-vm";
|
|
8
8
|
import { type SandboxOptions, type PoolOptions, type SandboxResult } from "./types.js";
|
|
9
|
-
/**
|
|
10
|
-
* A sandboxed execution context using isolated-vm
|
|
11
|
-
*/
|
|
12
9
|
export declare class CodeModeSandbox {
|
|
13
10
|
private readonly options;
|
|
14
11
|
private disposed;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/codemode/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AAEnC,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/codemode/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AAEnC,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAcpB,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAgB;IAEvC,OAAO;IAIP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,eAAe;IAQxD;;OAEG;IACG,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC;IAkYzB,gBAAgB,IAAI,MAAM,EAAE;IAI5B,kBAAkB,IAAI,IAAI;IAI1B,SAAS,IAAI,OAAO;IAIpB,OAAO,IAAI,IAAI;CAIhB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2B;IAC1D,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,MAAM,CAAC,UAAU,CAAoC;IAC7D,OAAO,CAAC,MAAM,CAAC,YAAY,CAA2B;gBAE1C,WAAW,CAAC,EAAE,WAAW,EAAE,cAAc,CAAC,EAAE,cAAc;IAKtE,MAAM,CAAC,SAAS,IAAI,OAAO,GAAG;WAUjB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC;IAiCzB,OAAO,IAAI,IAAI;IAOf,QAAQ,IAAI;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAS3E,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/codemode/security.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/codemode/security.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAKpB;;GAEG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAGzB;IACJ,OAAO,CAAC,WAAW,CAAC,CAAkB;gBAE1B,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAa5C;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB;IA2C5C;;;OAGG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAsDxD;;OAEG;IACG,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB9D;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO;IA8BxC;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IAqC1C;;OAEG;IACH,qBAAqB,CACnB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,OAAO,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,eAAe;IAclB;;OAEG;IACH,iBAAiB,IAAI,IAAI;CAQ1B"}
|
package/dist/codemode/types.d.ts
CHANGED
|
@@ -14,6 +14,8 @@ export interface SandboxOptions {
|
|
|
14
14
|
timeoutMs?: number;
|
|
15
15
|
/** CPU time limit in milliseconds (default: 10000) */
|
|
16
16
|
cpuLimitMs?: number;
|
|
17
|
+
/** Whether to hard-fail if isolated-vm is missing rather than fallback to node:vm (default: true) */
|
|
18
|
+
strictIsolation?: boolean;
|
|
17
19
|
}
|
|
18
20
|
/**
|
|
19
21
|
* Options for the sandbox pool
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/codemode/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAMnD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/codemode/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-instructions.d.ts","sourceRoot":"","sources":["../../src/constants/server-instructions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;GAGG;AACH,eAAO,MAAM,YAAY,g2BAoBwC,CAAC;AAElE;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"server-instructions.d.ts","sourceRoot":"","sources":["../../src/constants/server-instructions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;GAGG;AACH,eAAO,MAAM,YAAY,g2BAoBwC,CAAC;AAElE;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAy1BnD,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Defines the tool groups and meta-groups used for filtering.
|
|
5
5
|
*
|
|
6
6
|
* GROUP TOOLS (adapter-registered, accessible via Code Mode sqlite.help()):
|
|
7
|
-
* core:
|
|
7
|
+
* core: 25 tools (core/queries.ts, core/tables.ts, core/indexes.ts, core/convenience.ts, core/triggers.ts, core/constraints.ts, core/datetime.ts, core/alter-table.ts, core/versioning.ts)
|
|
8
8
|
* json: 25 tools (json-operations/crud+query+transform+security+diff.ts, json-helpers/read+write.ts)
|
|
9
9
|
* text: 15 WASM / 20 Native (text/regex+formatting+search+validate+sentiment.ts, fts.ts)
|
|
10
10
|
* stats: 17 WASM / 23 Native (stats/basic+advanced.ts, inference/, anomaly-detection.ts, schema-risks.ts, native: window.ts)
|
|
@@ -15,17 +15,17 @@
|
|
|
15
15
|
* introspection: 10 tools (introspection/graph/tools.ts, analysis/constraints+risks+snapshot+diff.ts, diagnostics/storage+indexes+query-plan.ts)
|
|
16
16
|
* migration: 6 tools (migration/tracking.ts) — opt-in
|
|
17
17
|
* codemode: 1 tool (codemode.ts)
|
|
18
|
-
* Subtotal:
|
|
18
|
+
* Subtotal: 143 WASM / 170 Native (excluding Code Mode)
|
|
19
19
|
*
|
|
20
20
|
* AUDIT & ADMIN TOOLS (server-level, MCP-only — NOT exposed in Code Mode):
|
|
21
21
|
* 7 tools (server/registration/audit-tools.ts, admin-tools.ts)
|
|
22
22
|
*
|
|
23
23
|
* TOOL COUNT TAXONOMY:
|
|
24
|
-
* Group tools:
|
|
24
|
+
* Group tools: 170 Native / 143 WASM (10 groups excluding Code Mode)
|
|
25
25
|
* Audit tools: 7 Native / 7 WASM (MCP-only)
|
|
26
|
-
* Inventory:
|
|
26
|
+
* Inventory: 177 Native / 150 WASM (Group + Audit)
|
|
27
27
|
* Built-in: 4 / 4 (server_info, health, adapters, execute_code)
|
|
28
|
-
* MCP total:
|
|
28
|
+
* MCP total: 181 Native / 154 WASM (tools/list response)
|
|
29
29
|
*/
|
|
30
30
|
import type { ToolGroup, MetaGroup } from "../types/index.js";
|
|
31
31
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-constants.d.ts","sourceRoot":"","sources":["../../src/filtering/tool-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,EAYtC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"tool-constants.d.ts","sourceRoot":"","sources":["../../src/filtering/tool-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,EAYtC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAmNnD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,CAiCtD,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createModuleLogger, DbMcpError, metrics, runWithAuthContext, ERROR_CODES, logger, SUPPORTED_SCOPES, scopesGrantToolAccess, InsufficientScopeError, hasAdminScope, hasReadScope, isOAuthError, BASE_SCOPES, AuthServerDiscoveryError, JwksFetchError, parseScopes, TokenExpiredError, InvalidSignatureError, InvalidTokenError, TokenMissingError } from './chunk-
|
|
1
|
+
import { createModuleLogger, DbMcpError, ErrorCategory, metrics, runWithAuthContext, ERROR_CODES, logger, ConfigurationError, SUPPORTED_SCOPES, scopesGrantToolAccess, InsufficientScopeError, hasAdminScope, hasReadScope, isOAuthError, BASE_SCOPES, AuthServerDiscoveryError, JwksFetchError, parseScopes, TokenExpiredError, InvalidSignatureError, InvalidTokenError, TokenMissingError } from './chunk-XLIYO3YA.js';
|
|
2
2
|
import express from 'express';
|
|
3
3
|
import { localhostHostValidation } from '@modelcontextprotocol/sdk/server/middleware/hostHeaderValidation.js';
|
|
4
4
|
import cors from 'cors';
|
|
@@ -148,6 +148,9 @@ var JSONRPC_INTERNAL_ERROR = -32603;
|
|
|
148
148
|
var HTTP_REQUEST_TIMEOUT_MS = 12e4;
|
|
149
149
|
var HTTP_KEEP_ALIVE_TIMEOUT_MS = 65e3;
|
|
150
150
|
var HTTP_HEADERS_TIMEOUT_MS = 66e3;
|
|
151
|
+
var SESSION_TIMEOUT_MS = 30 * 60 * 1e3;
|
|
152
|
+
var SESSION_SWEEP_INTERVAL_MS = 1 * 60 * 1e3;
|
|
153
|
+
var SESSION_ABSOLUTE_TTL_MS = 24 * 60 * 60 * 1e3;
|
|
151
154
|
function setupSecurityHeaders(state) {
|
|
152
155
|
if (!state.app) return;
|
|
153
156
|
state.app.disable("x-powered-by");
|
|
@@ -251,7 +254,12 @@ function setupRateLimiting(state) {
|
|
|
251
254
|
skip: (req) => req.path === "/health",
|
|
252
255
|
handler: (_req, res, _next, options) => {
|
|
253
256
|
res.status(options.statusCode).json({
|
|
254
|
-
|
|
257
|
+
success: false,
|
|
258
|
+
error: "Too Many Requests",
|
|
259
|
+
code: "RATE_LIMIT_ERROR",
|
|
260
|
+
category: "rate_limit",
|
|
261
|
+
suggestion: "Wait before retrying. Reduce request frequency or configure MCP_RATE_LIMIT_MAX.",
|
|
262
|
+
recoverable: true
|
|
255
263
|
});
|
|
256
264
|
}
|
|
257
265
|
});
|
|
@@ -273,7 +281,7 @@ async function setupStatelessEndpoints(state) {
|
|
|
273
281
|
throw new DbMcpError(
|
|
274
282
|
"Transport or server not initialized",
|
|
275
283
|
ERROR_CODES.SERVER.TRANSPORT_ERROR.full,
|
|
276
|
-
|
|
284
|
+
ErrorCategory.INTERNAL
|
|
277
285
|
);
|
|
278
286
|
}
|
|
279
287
|
state.statelessTransport = new StreamableHTTPServerTransport({
|
|
@@ -354,15 +362,49 @@ function isValidSessionId(id) {
|
|
|
354
362
|
if (id.length !== 36) return false;
|
|
355
363
|
return /^[0-9a-fA-F-]{36}$/.test(id);
|
|
356
364
|
}
|
|
365
|
+
function touchSession(state, sessionId) {
|
|
366
|
+
state.sessionLastActivity.set(sessionId, Date.now());
|
|
367
|
+
}
|
|
357
368
|
function setupStatefulEndpoints(state) {
|
|
358
369
|
if (!state.app || !state.mcpServer) {
|
|
359
370
|
throw new DbMcpError(
|
|
360
371
|
"Transport or server not initialized",
|
|
361
372
|
ERROR_CODES.SERVER.TRANSPORT_ERROR.full,
|
|
362
|
-
|
|
373
|
+
ErrorCategory.INTERNAL
|
|
363
374
|
);
|
|
364
375
|
}
|
|
365
376
|
const server = state.mcpServer;
|
|
377
|
+
const sessionSweepTimer = setInterval(() => {
|
|
378
|
+
const now = Date.now();
|
|
379
|
+
for (const [sid, lastActivity] of state.sessionLastActivity) {
|
|
380
|
+
const idleMs = now - lastActivity;
|
|
381
|
+
if (idleMs <= SESSION_TIMEOUT_MS) continue;
|
|
382
|
+
if ((state.sessionLocks.get(sid) ?? 0) > 0) continue;
|
|
383
|
+
if (state.transports.has(sid)) {
|
|
384
|
+
logger5.info("Expiring idle HTTP session", {
|
|
385
|
+
code: "HTTP_SESSION_EXPIRE",
|
|
386
|
+
sessionId: sid,
|
|
387
|
+
idleMinutes: Math.round(idleMs / 6e4)
|
|
388
|
+
});
|
|
389
|
+
const t = state.transports.get(sid);
|
|
390
|
+
if (t) {
|
|
391
|
+
void t.close();
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
if (state.sseTransports.has(sid)) {
|
|
395
|
+
logger5.info("Expiring idle SSE session", {
|
|
396
|
+
code: "SSE_SESSION_EXPIRE",
|
|
397
|
+
sessionId: sid,
|
|
398
|
+
idleMinutes: Math.round(idleMs / 6e4)
|
|
399
|
+
});
|
|
400
|
+
const t = state.sseTransports.get(sid);
|
|
401
|
+
if (t) {
|
|
402
|
+
void t.close();
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}, SESSION_SWEEP_INTERVAL_MS);
|
|
407
|
+
sessionSweepTimer.unref();
|
|
366
408
|
state.app.post("/mcp", (req, res) => {
|
|
367
409
|
const sessionId = req.headers["mcp-session-id"];
|
|
368
410
|
if (sessionId !== void 0 && !isValidSessionId(sessionId)) {
|
|
@@ -412,10 +454,23 @@ function setupStatefulEndpoints(state) {
|
|
|
412
454
|
});
|
|
413
455
|
return;
|
|
414
456
|
}
|
|
457
|
+
const createdAt = state.sessionCreatedAt.get(sessionId) ?? Date.now();
|
|
458
|
+
if (Date.now() - createdAt > SESSION_ABSOLUTE_TTL_MS) {
|
|
459
|
+
res.status(401).json({
|
|
460
|
+
jsonrpc: "2.0",
|
|
461
|
+
error: {
|
|
462
|
+
code: JSONRPC_SERVER_ERROR,
|
|
463
|
+
message: "Unauthorized: Session absolute TTL expired"
|
|
464
|
+
},
|
|
465
|
+
id: null
|
|
466
|
+
});
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
touchSession(state, sessionId);
|
|
415
470
|
httpTransport = existingTransport;
|
|
416
471
|
} else if (sessionId === void 0 && isNewSessionRequest(req.body)) {
|
|
417
472
|
const maxSessions = state.config.maxSessions ?? 1e3;
|
|
418
|
-
if (state.transports.size >= maxSessions) {
|
|
473
|
+
if (state.transports.size + state.sseTransports.size >= maxSessions) {
|
|
419
474
|
res.status(429).json({
|
|
420
475
|
jsonrpc: "2.0",
|
|
421
476
|
error: {
|
|
@@ -434,6 +489,8 @@ function setupStatefulEndpoints(state) {
|
|
|
434
489
|
sessionId: sid
|
|
435
490
|
});
|
|
436
491
|
state.transports.set(sid, newTransport);
|
|
492
|
+
touchSession(state, sid);
|
|
493
|
+
state.sessionCreatedAt.set(sid, Date.now());
|
|
437
494
|
state.sessionOwners.set(sid, req.auth?.sub);
|
|
438
495
|
}
|
|
439
496
|
});
|
|
@@ -446,6 +503,9 @@ function setupStatefulEndpoints(state) {
|
|
|
446
503
|
});
|
|
447
504
|
state.transports.delete(sid);
|
|
448
505
|
state.sessionOwners.delete(sid);
|
|
506
|
+
state.sessionLastActivity.delete(sid);
|
|
507
|
+
state.sessionCreatedAt.delete(sid);
|
|
508
|
+
state.sessionLocks.delete(sid);
|
|
449
509
|
if ("subscriptionManager" in server) {
|
|
450
510
|
server.subscriptionManager.unsubscribeSession(sid);
|
|
451
511
|
}
|
|
@@ -492,11 +552,28 @@ function setupStatefulEndpoints(state) {
|
|
|
492
552
|
release();
|
|
493
553
|
}
|
|
494
554
|
});
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
555
|
+
const activeSid2 = newTransport.sessionId;
|
|
556
|
+
try {
|
|
557
|
+
if (activeSid2) {
|
|
558
|
+
const count = state.sessionLocks.get(activeSid2) ?? 0;
|
|
559
|
+
state.sessionLocks.set(activeSid2, count + 1);
|
|
560
|
+
}
|
|
561
|
+
await newTransport.handleRequest(
|
|
562
|
+
asIncoming(req),
|
|
563
|
+
asServerResponse(res),
|
|
564
|
+
req.body
|
|
565
|
+
);
|
|
566
|
+
} finally {
|
|
567
|
+
if (activeSid2) {
|
|
568
|
+
const count = state.sessionLocks.get(activeSid2) ?? 0;
|
|
569
|
+
if (count > 1) {
|
|
570
|
+
state.sessionLocks.set(activeSid2, count - 1);
|
|
571
|
+
} else {
|
|
572
|
+
state.sessionLocks.delete(activeSid2);
|
|
573
|
+
}
|
|
574
|
+
touchSession(state, activeSid2);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
500
577
|
return;
|
|
501
578
|
} else {
|
|
502
579
|
res.status(400).json({
|
|
@@ -509,12 +586,27 @@ function setupStatefulEndpoints(state) {
|
|
|
509
586
|
});
|
|
510
587
|
return;
|
|
511
588
|
}
|
|
512
|
-
|
|
589
|
+
const activeSid = sessionId;
|
|
590
|
+
try {
|
|
591
|
+
if (activeSid) {
|
|
592
|
+
const count = state.sessionLocks.get(activeSid) ?? 0;
|
|
593
|
+
state.sessionLocks.set(activeSid, count + 1);
|
|
594
|
+
}
|
|
513
595
|
await httpTransport.handleRequest(
|
|
514
596
|
asIncoming(req),
|
|
515
597
|
asServerResponse(res),
|
|
516
598
|
req.body
|
|
517
599
|
);
|
|
600
|
+
} finally {
|
|
601
|
+
if (activeSid) {
|
|
602
|
+
const count = state.sessionLocks.get(activeSid) ?? 0;
|
|
603
|
+
if (count > 1) {
|
|
604
|
+
state.sessionLocks.set(activeSid, count - 1);
|
|
605
|
+
} else {
|
|
606
|
+
state.sessionLocks.delete(activeSid);
|
|
607
|
+
}
|
|
608
|
+
touchSession(state, activeSid);
|
|
609
|
+
}
|
|
518
610
|
}
|
|
519
611
|
} catch (error) {
|
|
520
612
|
logger5.error("Error handling MCP request", {
|
|
@@ -549,6 +641,12 @@ function setupStatefulEndpoints(state) {
|
|
|
549
641
|
res.status(403).send("Forbidden: session belongs to a different client");
|
|
550
642
|
return;
|
|
551
643
|
}
|
|
644
|
+
const createdAt = state.sessionCreatedAt.get(sessionId) ?? Date.now();
|
|
645
|
+
if (Date.now() - createdAt > SESSION_ABSOLUTE_TTL_MS) {
|
|
646
|
+
res.status(401).send("Unauthorized: Session absolute TTL expired");
|
|
647
|
+
return;
|
|
648
|
+
}
|
|
649
|
+
touchSession(state, sessionId);
|
|
552
650
|
const lastEventId = req.headers["last-event-id"];
|
|
553
651
|
if (lastEventId !== void 0) {
|
|
554
652
|
logger5.debug("Client reconnecting with Last-Event-ID", {
|
|
@@ -557,9 +655,24 @@ function setupStatefulEndpoints(state) {
|
|
|
557
655
|
lastEventId
|
|
558
656
|
});
|
|
559
657
|
}
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
658
|
+
void (async () => {
|
|
659
|
+
try {
|
|
660
|
+
const count = state.sessionLocks.get(sessionId) ?? 0;
|
|
661
|
+
state.sessionLocks.set(sessionId, count + 1);
|
|
662
|
+
await httpTransport.handleRequest(
|
|
663
|
+
asIncoming(req),
|
|
664
|
+
asServerResponse(res)
|
|
665
|
+
);
|
|
666
|
+
} finally {
|
|
667
|
+
const count = state.sessionLocks.get(sessionId) ?? 0;
|
|
668
|
+
if (count > 1) {
|
|
669
|
+
state.sessionLocks.set(sessionId, count - 1);
|
|
670
|
+
} else {
|
|
671
|
+
state.sessionLocks.delete(sessionId);
|
|
672
|
+
}
|
|
673
|
+
touchSession(state, sessionId);
|
|
674
|
+
}
|
|
675
|
+
})();
|
|
563
676
|
});
|
|
564
677
|
state.app.delete("/mcp", (req, res) => {
|
|
565
678
|
const sessionId = req.headers["mcp-session-id"];
|
|
@@ -580,10 +693,26 @@ function setupStatefulEndpoints(state) {
|
|
|
580
693
|
code: "HTTP_SESSION_DELETE",
|
|
581
694
|
sessionId
|
|
582
695
|
});
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
696
|
+
void (async () => {
|
|
697
|
+
try {
|
|
698
|
+
const count = state.sessionLocks.get(sessionId) ?? 0;
|
|
699
|
+
state.sessionLocks.set(sessionId, count + 1);
|
|
700
|
+
await httpTransport.handleRequest(
|
|
701
|
+
asIncoming(req),
|
|
702
|
+
asServerResponse(res)
|
|
703
|
+
);
|
|
704
|
+
} finally {
|
|
705
|
+
const count = state.sessionLocks.get(sessionId) ?? 0;
|
|
706
|
+
if (count > 1) {
|
|
707
|
+
state.sessionLocks.set(sessionId, count - 1);
|
|
708
|
+
} else {
|
|
709
|
+
state.sessionLocks.delete(sessionId);
|
|
710
|
+
}
|
|
711
|
+
touchSession(state, sessionId);
|
|
712
|
+
}
|
|
713
|
+
})();
|
|
586
714
|
});
|
|
715
|
+
return sessionSweepTimer;
|
|
587
716
|
}
|
|
588
717
|
var logger6 = createModuleLogger("HTTP");
|
|
589
718
|
var connectionMutex2 = new Mutex();
|
|
@@ -601,6 +730,8 @@ function setupLegacySSEEndpoints(state) {
|
|
|
601
730
|
void (async () => {
|
|
602
731
|
try {
|
|
603
732
|
state.sseTransports.set(sseTransport.sessionId, sseTransport);
|
|
733
|
+
touchSession(state, sseTransport.sessionId);
|
|
734
|
+
state.sessionCreatedAt.set(sseTransport.sessionId, Date.now());
|
|
604
735
|
state.sessionOwners.set(sseTransport.sessionId, req.auth?.sub);
|
|
605
736
|
sseTransport.onclose = () => {
|
|
606
737
|
logger6.info("Legacy SSE transport closed", {
|
|
@@ -609,6 +740,8 @@ function setupLegacySSEEndpoints(state) {
|
|
|
609
740
|
});
|
|
610
741
|
state.sseTransports.delete(sseTransport.sessionId);
|
|
611
742
|
state.sessionOwners.delete(sseTransport.sessionId);
|
|
743
|
+
state.sessionLastActivity.delete(sseTransport.sessionId);
|
|
744
|
+
state.sessionCreatedAt.delete(sseTransport.sessionId);
|
|
612
745
|
if ("subscriptionManager" in server) {
|
|
613
746
|
server.subscriptionManager.unsubscribeSession(sseTransport.sessionId);
|
|
614
747
|
}
|
|
@@ -672,6 +805,8 @@ function setupLegacySSEEndpoints(state) {
|
|
|
672
805
|
req.on("close", () => {
|
|
673
806
|
state.sseTransports.delete(sseTransport.sessionId);
|
|
674
807
|
state.sessionOwners.delete(sseTransport.sessionId);
|
|
808
|
+
state.sessionLastActivity.delete(sseTransport.sessionId);
|
|
809
|
+
state.sessionCreatedAt.delete(sseTransport.sessionId);
|
|
675
810
|
});
|
|
676
811
|
});
|
|
677
812
|
state.app.post("/messages", (req, res) => {
|
|
@@ -710,6 +845,7 @@ function setupLegacySSEEndpoints(state) {
|
|
|
710
845
|
});
|
|
711
846
|
return;
|
|
712
847
|
}
|
|
848
|
+
touchSession(state, sessionId);
|
|
713
849
|
void sseTransport.handlePostMessage(
|
|
714
850
|
asIncoming(req),
|
|
715
851
|
asServerResponse(res),
|
|
@@ -858,7 +994,7 @@ var AuthorizationServerDiscovery = class {
|
|
|
858
994
|
const url = new URL(this.authServerUrl);
|
|
859
995
|
const isLocalDev = url.hostname === "localhost" || url.hostname === "127.0.0.1" || url.hostname === "[::1]";
|
|
860
996
|
if (!isLocalDev) {
|
|
861
|
-
throw new
|
|
997
|
+
throw new ConfigurationError(
|
|
862
998
|
`Security: Authorization server URL must use HTTPS in production. Got: ${this.authServerUrl}. Set NODE_ENV=development to allow HTTP for local testing.`
|
|
863
999
|
);
|
|
864
1000
|
}
|
|
@@ -903,7 +1039,7 @@ var AuthorizationServerDiscovery = class {
|
|
|
903
1039
|
throw new DbMcpError(
|
|
904
1040
|
`HTTP ${String(response.status)}: ${response.statusText}`,
|
|
905
1041
|
ERROR_CODES.AUTH.DISCOVERY_FAILED.full,
|
|
906
|
-
|
|
1042
|
+
ErrorCategory.CONNECTION
|
|
907
1043
|
);
|
|
908
1044
|
}
|
|
909
1045
|
const metadata = await response.json();
|
|
@@ -937,14 +1073,14 @@ var AuthorizationServerDiscovery = class {
|
|
|
937
1073
|
throw new DbMcpError(
|
|
938
1074
|
"Missing required field: issuer",
|
|
939
1075
|
"AUTH_DISCOVERY_INVALID",
|
|
940
|
-
|
|
1076
|
+
ErrorCategory.VALIDATION
|
|
941
1077
|
);
|
|
942
1078
|
}
|
|
943
1079
|
if (!metadata.token_endpoint) {
|
|
944
1080
|
throw new DbMcpError(
|
|
945
1081
|
"Missing required field: token_endpoint",
|
|
946
1082
|
"AUTH_DISCOVERY_INVALID",
|
|
947
|
-
|
|
1083
|
+
ErrorCategory.VALIDATION
|
|
948
1084
|
);
|
|
949
1085
|
}
|
|
950
1086
|
try {
|
|
@@ -954,7 +1090,7 @@ var AuthorizationServerDiscovery = class {
|
|
|
954
1090
|
throw new DbMcpError(
|
|
955
1091
|
"Invalid URL format in metadata fields",
|
|
956
1092
|
"AUTH_DISCOVERY_INVALID",
|
|
957
|
-
|
|
1093
|
+
ErrorCategory.VALIDATION
|
|
958
1094
|
);
|
|
959
1095
|
}
|
|
960
1096
|
const expectedIssuer = this.authServerUrl;
|
|
@@ -962,7 +1098,7 @@ var AuthorizationServerDiscovery = class {
|
|
|
962
1098
|
throw new DbMcpError(
|
|
963
1099
|
`Issuer validation failed. Per RFC 8414 \xA73.3, the issuer MUST be identical to the authorization server URL.`,
|
|
964
1100
|
"AUTH_ISSUER_MISMATCH",
|
|
965
|
-
|
|
1101
|
+
ErrorCategory.VALIDATION
|
|
966
1102
|
);
|
|
967
1103
|
}
|
|
968
1104
|
}
|
|
@@ -974,7 +1110,7 @@ var AuthorizationServerDiscovery = class {
|
|
|
974
1110
|
throw new DbMcpError(
|
|
975
1111
|
"Authorization server metadata not yet discovered. Call discover() first.",
|
|
976
1112
|
"AUTH_DISCOVERY_REQUIRED",
|
|
977
|
-
|
|
1113
|
+
ErrorCategory.INTERNAL
|
|
978
1114
|
);
|
|
979
1115
|
}
|
|
980
1116
|
return this.cachedMetadata;
|
|
@@ -990,7 +1126,7 @@ var AuthorizationServerDiscovery = class {
|
|
|
990
1126
|
throw new DbMcpError(
|
|
991
1127
|
"Authorization server does not provide jwks_uri",
|
|
992
1128
|
"AUTH_DISCOVERY_INVALID",
|
|
993
|
-
|
|
1129
|
+
ErrorCategory.VALIDATION
|
|
994
1130
|
);
|
|
995
1131
|
}
|
|
996
1132
|
return metadata.jwks_uri;
|
|
@@ -1082,7 +1218,7 @@ var TokenValidator = class _TokenValidator {
|
|
|
1082
1218
|
const url = new URL(config.jwksUri);
|
|
1083
1219
|
const isLocalDev = url.hostname === "localhost" || url.hostname === "127.0.0.1";
|
|
1084
1220
|
if (!isLocalDev) {
|
|
1085
|
-
throw new
|
|
1221
|
+
throw new ConfigurationError(
|
|
1086
1222
|
`Security: JWKS URI must use HTTPS in production. Got: ${config.jwksUri}. Set ALLOW_HTTP_JWKS=true to allow HTTP for local testing.`
|
|
1087
1223
|
);
|
|
1088
1224
|
}
|
|
@@ -1292,7 +1428,7 @@ function applyAuthMiddleware(state) {
|
|
|
1292
1428
|
const corsOrigins = state.config.corsOrigins ?? [];
|
|
1293
1429
|
const isPubliclyExposed = state.config.oauth.enabled || state.config.noAuthEnforcement;
|
|
1294
1430
|
if (corsOrigins.includes("*") && isPubliclyExposed) {
|
|
1295
|
-
throw new
|
|
1431
|
+
throw new ConfigurationError(
|
|
1296
1432
|
"Security: CORS wildcard origin ('*') is forbidden when authentication is enabled or enforcement is explicitly disabled. Configure explicit origins via --cors-origins for production deployments."
|
|
1297
1433
|
);
|
|
1298
1434
|
}
|
|
@@ -1441,7 +1577,7 @@ function applyScopeEnforcementMiddleware(state) {
|
|
|
1441
1577
|
async function setupOAuth(state, resourceUri) {
|
|
1442
1578
|
logger10.info("Setting up OAuth 2.1...", { code: "HTTP_OAUTH_SETUP" });
|
|
1443
1579
|
if (state.config.oauth.enabled && !state.config.oauth.audience) {
|
|
1444
|
-
throw new
|
|
1580
|
+
throw new ConfigurationError(
|
|
1445
1581
|
"Security: OAuth audience must be explicitly configured when OAuth is enabled."
|
|
1446
1582
|
);
|
|
1447
1583
|
}
|
|
@@ -1495,6 +1631,8 @@ var logger11 = createModuleLogger("HTTP");
|
|
|
1495
1631
|
var HttpTransport = class {
|
|
1496
1632
|
/** Internal state shared with session/middleware/oauth modules */
|
|
1497
1633
|
state;
|
|
1634
|
+
/** Sweep timer for session timeout cleanup */
|
|
1635
|
+
sweepTimer = null;
|
|
1498
1636
|
constructor(config) {
|
|
1499
1637
|
this.state = {
|
|
1500
1638
|
config: {
|
|
@@ -1508,6 +1646,9 @@ var HttpTransport = class {
|
|
|
1508
1646
|
transports: /* @__PURE__ */ new Map(),
|
|
1509
1647
|
sseTransports: /* @__PURE__ */ new Map(),
|
|
1510
1648
|
sessionOwners: /* @__PURE__ */ new Map(),
|
|
1649
|
+
sessionLastActivity: /* @__PURE__ */ new Map(),
|
|
1650
|
+
sessionCreatedAt: /* @__PURE__ */ new Map(),
|
|
1651
|
+
sessionLocks: /* @__PURE__ */ new Map(),
|
|
1511
1652
|
statelessTransport: null,
|
|
1512
1653
|
resourceServer: null,
|
|
1513
1654
|
authServerDiscovery: null,
|
|
@@ -1536,7 +1677,7 @@ var HttpTransport = class {
|
|
|
1536
1677
|
throw new DbMcpError(
|
|
1537
1678
|
"trustedProxyIps cannot be an empty array if specified",
|
|
1538
1679
|
"CONFIG_ERROR",
|
|
1539
|
-
|
|
1680
|
+
ErrorCategory.CONFIGURATION
|
|
1540
1681
|
);
|
|
1541
1682
|
}
|
|
1542
1683
|
this.state.app.set("trust proxy", this.state.config.trustedProxyIps);
|
|
@@ -1555,7 +1696,7 @@ var HttpTransport = class {
|
|
|
1555
1696
|
throw new DbMcpError(
|
|
1556
1697
|
"HTTP transport is enabled without authentication. You must configure OAuth (--oauth-enabled) or explicitly bypass this check with --no-auth-enforcement.",
|
|
1557
1698
|
"AUTH_REQUIRED",
|
|
1558
|
-
|
|
1699
|
+
ErrorCategory.CONFIGURATION
|
|
1559
1700
|
);
|
|
1560
1701
|
}
|
|
1561
1702
|
if (this.state.config.oauth.enabled) {
|
|
@@ -1629,7 +1770,7 @@ var HttpTransport = class {
|
|
|
1629
1770
|
if (this.state.config.stateless) {
|
|
1630
1771
|
await setupStatelessEndpoints(this.state);
|
|
1631
1772
|
} else {
|
|
1632
|
-
setupStatefulEndpoints(this.state);
|
|
1773
|
+
this.sweepTimer = setupStatefulEndpoints(this.state);
|
|
1633
1774
|
}
|
|
1634
1775
|
if (!this.state.config.stateless) {
|
|
1635
1776
|
setupLegacySSEEndpoints(this.state);
|
|
@@ -1654,7 +1795,7 @@ var HttpTransport = class {
|
|
|
1654
1795
|
throw new DbMcpError(
|
|
1655
1796
|
"Transport not initialized. Call initialize() first.",
|
|
1656
1797
|
ERROR_CODES.SERVER.START_FAILED.full,
|
|
1657
|
-
|
|
1798
|
+
ErrorCategory.INTERNAL
|
|
1658
1799
|
);
|
|
1659
1800
|
}
|
|
1660
1801
|
return new Promise((resolve, reject) => {
|
|
@@ -1694,6 +1835,10 @@ var HttpTransport = class {
|
|
|
1694
1835
|
* Stop the server and close all active sessions
|
|
1695
1836
|
*/
|
|
1696
1837
|
async stop() {
|
|
1838
|
+
if (this.sweepTimer) {
|
|
1839
|
+
clearInterval(this.sweepTimer);
|
|
1840
|
+
this.sweepTimer = null;
|
|
1841
|
+
}
|
|
1697
1842
|
for (const [sessionId, transport] of this.state.transports) {
|
|
1698
1843
|
try {
|
|
1699
1844
|
logger11.debug("Closing transport", {
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { DEFAULT_CONFIG, DbMcpServer, createServer } from './chunk-
|
|
2
|
-
export { DatabaseAdapter } from './chunk-
|
|
3
|
-
export { NAME, VERSION } from './chunk-
|
|
4
|
-
export { ALL_TOOL_GROUPS, AuthenticationError, AuthorizationError, ConnectionError, DbMcpError, META_GROUPS, QueryError, TOOL_GROUPS, ValidationError, filterTools, getFilterSummary, getToolFilterFromEnv, isToolEnabled, parseToolFilter } from './chunk-
|
|
1
|
+
export { DEFAULT_CONFIG, DbMcpServer, createServer } from './chunk-WYBUO4FL.js';
|
|
2
|
+
export { DatabaseAdapter } from './chunk-27C5EE6U.js';
|
|
3
|
+
export { NAME, VERSION } from './chunk-2TYICG7B.js';
|
|
4
|
+
export { ALL_TOOL_GROUPS, AuthenticationError, AuthorizationError, ConnectionError, DbMcpError, META_GROUPS, QueryError, TOOL_GROUPS, ValidationError, filterTools, getFilterSummary, getToolFilterFromEnv, isToolEnabled, parseToolFilter } from './chunk-XLIYO3YA.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-db.d.ts","sourceRoot":"","sources":["../../src/observability/system-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"system-db.d.ts","sourceRoot":"","sources":["../../src/observability/system-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAM/C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE5B,MAAM,EAAE,cAAc;IAI5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmF3B,KAAK,IAAI,QAAQ;IAOjB,KAAK,IAAI,IAAI;CAMd"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAwCvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AA+ChE;;;;GAIG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,gBAAgB,CAA8B;IACtD,SAAgB,mBAAmB,EAAE,mBAAmB,CAAC;gBAE7C,MAAM,EAAE,eAAe;IAyLnC;;OAEG;IACG,eAAe,CACnB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;IAiEhB;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI1D;;OAEG;IACH,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC;IAI3C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B;;OAEG;YACW,UAAU;IAiBxB;;OAEG;YACW,SAAS;IAyDvB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAwC/B;;;OAGG;YACW,eAAe;CA8C9B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW,CAEjE;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,eAAe,CAKnD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-tools.d.ts","sourceRoot":"","sources":["../../../src/server/registration/admin-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"admin-tools.d.ts","sourceRoot":"","sources":["../../../src/server/registration/admin-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkL1D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { DatabaseAdapter } from "../../../adapters/database-adapter.js";
|
|
3
|
+
import type { BackupManager } from "../../../audit/backup-manager.js";
|
|
4
|
+
/**
|
|
5
|
+
* Register audit backup tools for snapshot management.
|
|
6
|
+
*/
|
|
7
|
+
export declare function registerAuditBackupTools(server: McpServer, backupManager: BackupManager | null, adaptersMap: Map<string, DatabaseAdapter>): void;
|
|
8
|
+
//# sourceMappingURL=backup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../../../src/server/registration/audit-tools/backup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAqBtE;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,aAAa,EAAE,aAAa,GAAG,IAAI,EACnC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,GACxC,IAAI,CAkoBN"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Force redaction of SQL string literals to prevent secret exposure
|
|
3
|
+
* in audit logs and backups, regardless of operator configuration.
|
|
4
|
+
*/
|
|
5
|
+
export declare function redactSqlLiterals(text: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Validate DDL to prevent execution of unauthorized or destructive statements
|
|
8
|
+
* during restore operations from tampered backups.
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateDdl(sql: string): void;
|
|
11
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/server/registration/audit-tools/helpers.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAqB7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/registration/audit-tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { BackupManager } from "../../../audit/backup-manager.js";
|
|
3
|
+
import type { AuditLogger } from "../../../audit/logger.js";
|
|
4
|
+
/**
|
|
5
|
+
* Register the sqlite://audit resource for agent access to audit log.
|
|
6
|
+
*/
|
|
7
|
+
export declare function registerAuditResource(server: McpServer, auditLogger: AuditLogger | null, backupManager: BackupManager | null): void;
|
|
8
|
+
//# sourceMappingURL=resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../../../src/server/registration/audit-tools/resource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI5D;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,WAAW,GAAG,IAAI,EAC/B,aAAa,EAAE,aAAa,GAAG,IAAI,GAClC,IAAI,CAuCN"}
|