db-mcp 4.0.0 → 5.0.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 +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-NIC5Z2CA.js → chunk-LLIAIJPO.js} +394 -381
- package/dist/{chunk-TGE7LFAR.js → chunk-UE7GVOBV.js} +1069 -355
- 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-ZDMK46QU.js} +183 -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 +35 -38
- 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 activeSid = newTransport.sessionId;
|
|
556
|
+
try {
|
|
557
|
+
if (activeSid) {
|
|
558
|
+
const count = state.sessionLocks.get(activeSid) ?? 0;
|
|
559
|
+
state.sessionLocks.set(activeSid, count + 1);
|
|
560
|
+
}
|
|
561
|
+
await newTransport.handleRequest(
|
|
562
|
+
asIncoming(req),
|
|
563
|
+
asServerResponse(res),
|
|
564
|
+
req.body
|
|
565
|
+
);
|
|
566
|
+
} finally {
|
|
567
|
+
if (activeSid) {
|
|
568
|
+
const count = state.sessionLocks.get(activeSid) ?? 0;
|
|
569
|
+
if (count > 1) {
|
|
570
|
+
state.sessionLocks.set(activeSid, count - 1);
|
|
571
|
+
} else {
|
|
572
|
+
state.sessionLocks.delete(activeSid);
|
|
573
|
+
}
|
|
574
|
+
touchSession(state, activeSid);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
500
577
|
return;
|
|
501
578
|
} else {
|
|
502
579
|
res.status(400).json({
|
|
@@ -510,11 +587,28 @@ function setupStatefulEndpoints(state) {
|
|
|
510
587
|
return;
|
|
511
588
|
}
|
|
512
589
|
if (httpTransport !== void 0) {
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
590
|
+
const activeSid = sessionId;
|
|
591
|
+
try {
|
|
592
|
+
if (activeSid) {
|
|
593
|
+
const count = state.sessionLocks.get(activeSid) ?? 0;
|
|
594
|
+
state.sessionLocks.set(activeSid, count + 1);
|
|
595
|
+
}
|
|
596
|
+
await httpTransport.handleRequest(
|
|
597
|
+
asIncoming(req),
|
|
598
|
+
asServerResponse(res),
|
|
599
|
+
req.body
|
|
600
|
+
);
|
|
601
|
+
} finally {
|
|
602
|
+
if (activeSid) {
|
|
603
|
+
const count = state.sessionLocks.get(activeSid) ?? 0;
|
|
604
|
+
if (count > 1) {
|
|
605
|
+
state.sessionLocks.set(activeSid, count - 1);
|
|
606
|
+
} else {
|
|
607
|
+
state.sessionLocks.delete(activeSid);
|
|
608
|
+
}
|
|
609
|
+
touchSession(state, activeSid);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
518
612
|
}
|
|
519
613
|
} catch (error) {
|
|
520
614
|
logger5.error("Error handling MCP request", {
|
|
@@ -549,6 +643,12 @@ function setupStatefulEndpoints(state) {
|
|
|
549
643
|
res.status(403).send("Forbidden: session belongs to a different client");
|
|
550
644
|
return;
|
|
551
645
|
}
|
|
646
|
+
const createdAt = state.sessionCreatedAt.get(sessionId) ?? Date.now();
|
|
647
|
+
if (Date.now() - createdAt > SESSION_ABSOLUTE_TTL_MS) {
|
|
648
|
+
res.status(401).send("Unauthorized: Session absolute TTL expired");
|
|
649
|
+
return;
|
|
650
|
+
}
|
|
651
|
+
touchSession(state, sessionId);
|
|
552
652
|
const lastEventId = req.headers["last-event-id"];
|
|
553
653
|
if (lastEventId !== void 0) {
|
|
554
654
|
logger5.debug("Client reconnecting with Last-Event-ID", {
|
|
@@ -558,7 +658,24 @@ function setupStatefulEndpoints(state) {
|
|
|
558
658
|
});
|
|
559
659
|
}
|
|
560
660
|
if (httpTransport !== void 0) {
|
|
561
|
-
void
|
|
661
|
+
void (async () => {
|
|
662
|
+
try {
|
|
663
|
+
const count = state.sessionLocks.get(sessionId) ?? 0;
|
|
664
|
+
state.sessionLocks.set(sessionId, count + 1);
|
|
665
|
+
await httpTransport.handleRequest(
|
|
666
|
+
asIncoming(req),
|
|
667
|
+
asServerResponse(res)
|
|
668
|
+
);
|
|
669
|
+
} finally {
|
|
670
|
+
const count = state.sessionLocks.get(sessionId) ?? 0;
|
|
671
|
+
if (count > 1) {
|
|
672
|
+
state.sessionLocks.set(sessionId, count - 1);
|
|
673
|
+
} else {
|
|
674
|
+
state.sessionLocks.delete(sessionId);
|
|
675
|
+
}
|
|
676
|
+
touchSession(state, sessionId);
|
|
677
|
+
}
|
|
678
|
+
})();
|
|
562
679
|
}
|
|
563
680
|
});
|
|
564
681
|
state.app.delete("/mcp", (req, res) => {
|
|
@@ -581,9 +698,27 @@ function setupStatefulEndpoints(state) {
|
|
|
581
698
|
sessionId
|
|
582
699
|
});
|
|
583
700
|
if (httpTransport !== void 0) {
|
|
584
|
-
void
|
|
701
|
+
void (async () => {
|
|
702
|
+
try {
|
|
703
|
+
const count = state.sessionLocks.get(sessionId) ?? 0;
|
|
704
|
+
state.sessionLocks.set(sessionId, count + 1);
|
|
705
|
+
await httpTransport.handleRequest(
|
|
706
|
+
asIncoming(req),
|
|
707
|
+
asServerResponse(res)
|
|
708
|
+
);
|
|
709
|
+
} finally {
|
|
710
|
+
const count = state.sessionLocks.get(sessionId) ?? 0;
|
|
711
|
+
if (count > 1) {
|
|
712
|
+
state.sessionLocks.set(sessionId, count - 1);
|
|
713
|
+
} else {
|
|
714
|
+
state.sessionLocks.delete(sessionId);
|
|
715
|
+
}
|
|
716
|
+
touchSession(state, sessionId);
|
|
717
|
+
}
|
|
718
|
+
})();
|
|
585
719
|
}
|
|
586
720
|
});
|
|
721
|
+
return sessionSweepTimer;
|
|
587
722
|
}
|
|
588
723
|
var logger6 = createModuleLogger("HTTP");
|
|
589
724
|
var connectionMutex2 = new Mutex();
|
|
@@ -601,6 +736,8 @@ function setupLegacySSEEndpoints(state) {
|
|
|
601
736
|
void (async () => {
|
|
602
737
|
try {
|
|
603
738
|
state.sseTransports.set(sseTransport.sessionId, sseTransport);
|
|
739
|
+
touchSession(state, sseTransport.sessionId);
|
|
740
|
+
state.sessionCreatedAt.set(sseTransport.sessionId, Date.now());
|
|
604
741
|
state.sessionOwners.set(sseTransport.sessionId, req.auth?.sub);
|
|
605
742
|
sseTransport.onclose = () => {
|
|
606
743
|
logger6.info("Legacy SSE transport closed", {
|
|
@@ -609,6 +746,8 @@ function setupLegacySSEEndpoints(state) {
|
|
|
609
746
|
});
|
|
610
747
|
state.sseTransports.delete(sseTransport.sessionId);
|
|
611
748
|
state.sessionOwners.delete(sseTransport.sessionId);
|
|
749
|
+
state.sessionLastActivity.delete(sseTransport.sessionId);
|
|
750
|
+
state.sessionCreatedAt.delete(sseTransport.sessionId);
|
|
612
751
|
if ("subscriptionManager" in server) {
|
|
613
752
|
server.subscriptionManager.unsubscribeSession(sseTransport.sessionId);
|
|
614
753
|
}
|
|
@@ -672,6 +811,8 @@ function setupLegacySSEEndpoints(state) {
|
|
|
672
811
|
req.on("close", () => {
|
|
673
812
|
state.sseTransports.delete(sseTransport.sessionId);
|
|
674
813
|
state.sessionOwners.delete(sseTransport.sessionId);
|
|
814
|
+
state.sessionLastActivity.delete(sseTransport.sessionId);
|
|
815
|
+
state.sessionCreatedAt.delete(sseTransport.sessionId);
|
|
675
816
|
});
|
|
676
817
|
});
|
|
677
818
|
state.app.post("/messages", (req, res) => {
|
|
@@ -710,6 +851,7 @@ function setupLegacySSEEndpoints(state) {
|
|
|
710
851
|
});
|
|
711
852
|
return;
|
|
712
853
|
}
|
|
854
|
+
touchSession(state, sessionId);
|
|
713
855
|
void sseTransport.handlePostMessage(
|
|
714
856
|
asIncoming(req),
|
|
715
857
|
asServerResponse(res),
|
|
@@ -858,7 +1000,7 @@ var AuthorizationServerDiscovery = class {
|
|
|
858
1000
|
const url = new URL(this.authServerUrl);
|
|
859
1001
|
const isLocalDev = url.hostname === "localhost" || url.hostname === "127.0.0.1" || url.hostname === "[::1]";
|
|
860
1002
|
if (!isLocalDev) {
|
|
861
|
-
throw new
|
|
1003
|
+
throw new ConfigurationError(
|
|
862
1004
|
`Security: Authorization server URL must use HTTPS in production. Got: ${this.authServerUrl}. Set NODE_ENV=development to allow HTTP for local testing.`
|
|
863
1005
|
);
|
|
864
1006
|
}
|
|
@@ -903,7 +1045,7 @@ var AuthorizationServerDiscovery = class {
|
|
|
903
1045
|
throw new DbMcpError(
|
|
904
1046
|
`HTTP ${String(response.status)}: ${response.statusText}`,
|
|
905
1047
|
ERROR_CODES.AUTH.DISCOVERY_FAILED.full,
|
|
906
|
-
|
|
1048
|
+
ErrorCategory.CONNECTION
|
|
907
1049
|
);
|
|
908
1050
|
}
|
|
909
1051
|
const metadata = await response.json();
|
|
@@ -937,14 +1079,14 @@ var AuthorizationServerDiscovery = class {
|
|
|
937
1079
|
throw new DbMcpError(
|
|
938
1080
|
"Missing required field: issuer",
|
|
939
1081
|
"AUTH_DISCOVERY_INVALID",
|
|
940
|
-
|
|
1082
|
+
ErrorCategory.VALIDATION
|
|
941
1083
|
);
|
|
942
1084
|
}
|
|
943
1085
|
if (!metadata.token_endpoint) {
|
|
944
1086
|
throw new DbMcpError(
|
|
945
1087
|
"Missing required field: token_endpoint",
|
|
946
1088
|
"AUTH_DISCOVERY_INVALID",
|
|
947
|
-
|
|
1089
|
+
ErrorCategory.VALIDATION
|
|
948
1090
|
);
|
|
949
1091
|
}
|
|
950
1092
|
try {
|
|
@@ -954,7 +1096,7 @@ var AuthorizationServerDiscovery = class {
|
|
|
954
1096
|
throw new DbMcpError(
|
|
955
1097
|
"Invalid URL format in metadata fields",
|
|
956
1098
|
"AUTH_DISCOVERY_INVALID",
|
|
957
|
-
|
|
1099
|
+
ErrorCategory.VALIDATION
|
|
958
1100
|
);
|
|
959
1101
|
}
|
|
960
1102
|
const expectedIssuer = this.authServerUrl;
|
|
@@ -962,7 +1104,7 @@ var AuthorizationServerDiscovery = class {
|
|
|
962
1104
|
throw new DbMcpError(
|
|
963
1105
|
`Issuer validation failed. Per RFC 8414 \xA73.3, the issuer MUST be identical to the authorization server URL.`,
|
|
964
1106
|
"AUTH_ISSUER_MISMATCH",
|
|
965
|
-
|
|
1107
|
+
ErrorCategory.VALIDATION
|
|
966
1108
|
);
|
|
967
1109
|
}
|
|
968
1110
|
}
|
|
@@ -974,7 +1116,7 @@ var AuthorizationServerDiscovery = class {
|
|
|
974
1116
|
throw new DbMcpError(
|
|
975
1117
|
"Authorization server metadata not yet discovered. Call discover() first.",
|
|
976
1118
|
"AUTH_DISCOVERY_REQUIRED",
|
|
977
|
-
|
|
1119
|
+
ErrorCategory.INTERNAL
|
|
978
1120
|
);
|
|
979
1121
|
}
|
|
980
1122
|
return this.cachedMetadata;
|
|
@@ -990,7 +1132,7 @@ var AuthorizationServerDiscovery = class {
|
|
|
990
1132
|
throw new DbMcpError(
|
|
991
1133
|
"Authorization server does not provide jwks_uri",
|
|
992
1134
|
"AUTH_DISCOVERY_INVALID",
|
|
993
|
-
|
|
1135
|
+
ErrorCategory.VALIDATION
|
|
994
1136
|
);
|
|
995
1137
|
}
|
|
996
1138
|
return metadata.jwks_uri;
|
|
@@ -1082,7 +1224,7 @@ var TokenValidator = class _TokenValidator {
|
|
|
1082
1224
|
const url = new URL(config.jwksUri);
|
|
1083
1225
|
const isLocalDev = url.hostname === "localhost" || url.hostname === "127.0.0.1";
|
|
1084
1226
|
if (!isLocalDev) {
|
|
1085
|
-
throw new
|
|
1227
|
+
throw new ConfigurationError(
|
|
1086
1228
|
`Security: JWKS URI must use HTTPS in production. Got: ${config.jwksUri}. Set ALLOW_HTTP_JWKS=true to allow HTTP for local testing.`
|
|
1087
1229
|
);
|
|
1088
1230
|
}
|
|
@@ -1292,7 +1434,7 @@ function applyAuthMiddleware(state) {
|
|
|
1292
1434
|
const corsOrigins = state.config.corsOrigins ?? [];
|
|
1293
1435
|
const isPubliclyExposed = state.config.oauth.enabled || state.config.noAuthEnforcement;
|
|
1294
1436
|
if (corsOrigins.includes("*") && isPubliclyExposed) {
|
|
1295
|
-
throw new
|
|
1437
|
+
throw new ConfigurationError(
|
|
1296
1438
|
"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
1439
|
);
|
|
1298
1440
|
}
|
|
@@ -1441,7 +1583,7 @@ function applyScopeEnforcementMiddleware(state) {
|
|
|
1441
1583
|
async function setupOAuth(state, resourceUri) {
|
|
1442
1584
|
logger10.info("Setting up OAuth 2.1...", { code: "HTTP_OAUTH_SETUP" });
|
|
1443
1585
|
if (state.config.oauth.enabled && !state.config.oauth.audience) {
|
|
1444
|
-
throw new
|
|
1586
|
+
throw new ConfigurationError(
|
|
1445
1587
|
"Security: OAuth audience must be explicitly configured when OAuth is enabled."
|
|
1446
1588
|
);
|
|
1447
1589
|
}
|
|
@@ -1495,6 +1637,8 @@ var logger11 = createModuleLogger("HTTP");
|
|
|
1495
1637
|
var HttpTransport = class {
|
|
1496
1638
|
/** Internal state shared with session/middleware/oauth modules */
|
|
1497
1639
|
state;
|
|
1640
|
+
/** Sweep timer for session timeout cleanup */
|
|
1641
|
+
sweepTimer = null;
|
|
1498
1642
|
constructor(config) {
|
|
1499
1643
|
this.state = {
|
|
1500
1644
|
config: {
|
|
@@ -1508,6 +1652,9 @@ var HttpTransport = class {
|
|
|
1508
1652
|
transports: /* @__PURE__ */ new Map(),
|
|
1509
1653
|
sseTransports: /* @__PURE__ */ new Map(),
|
|
1510
1654
|
sessionOwners: /* @__PURE__ */ new Map(),
|
|
1655
|
+
sessionLastActivity: /* @__PURE__ */ new Map(),
|
|
1656
|
+
sessionCreatedAt: /* @__PURE__ */ new Map(),
|
|
1657
|
+
sessionLocks: /* @__PURE__ */ new Map(),
|
|
1511
1658
|
statelessTransport: null,
|
|
1512
1659
|
resourceServer: null,
|
|
1513
1660
|
authServerDiscovery: null,
|
|
@@ -1536,7 +1683,7 @@ var HttpTransport = class {
|
|
|
1536
1683
|
throw new DbMcpError(
|
|
1537
1684
|
"trustedProxyIps cannot be an empty array if specified",
|
|
1538
1685
|
"CONFIG_ERROR",
|
|
1539
|
-
|
|
1686
|
+
ErrorCategory.CONFIGURATION
|
|
1540
1687
|
);
|
|
1541
1688
|
}
|
|
1542
1689
|
this.state.app.set("trust proxy", this.state.config.trustedProxyIps);
|
|
@@ -1555,7 +1702,7 @@ var HttpTransport = class {
|
|
|
1555
1702
|
throw new DbMcpError(
|
|
1556
1703
|
"HTTP transport is enabled without authentication. You must configure OAuth (--oauth-enabled) or explicitly bypass this check with --no-auth-enforcement.",
|
|
1557
1704
|
"AUTH_REQUIRED",
|
|
1558
|
-
|
|
1705
|
+
ErrorCategory.CONFIGURATION
|
|
1559
1706
|
);
|
|
1560
1707
|
}
|
|
1561
1708
|
if (this.state.config.oauth.enabled) {
|
|
@@ -1629,7 +1776,7 @@ var HttpTransport = class {
|
|
|
1629
1776
|
if (this.state.config.stateless) {
|
|
1630
1777
|
await setupStatelessEndpoints(this.state);
|
|
1631
1778
|
} else {
|
|
1632
|
-
setupStatefulEndpoints(this.state);
|
|
1779
|
+
this.sweepTimer = setupStatefulEndpoints(this.state);
|
|
1633
1780
|
}
|
|
1634
1781
|
if (!this.state.config.stateless) {
|
|
1635
1782
|
setupLegacySSEEndpoints(this.state);
|
|
@@ -1654,7 +1801,7 @@ var HttpTransport = class {
|
|
|
1654
1801
|
throw new DbMcpError(
|
|
1655
1802
|
"Transport not initialized. Call initialize() first.",
|
|
1656
1803
|
ERROR_CODES.SERVER.START_FAILED.full,
|
|
1657
|
-
|
|
1804
|
+
ErrorCategory.INTERNAL
|
|
1658
1805
|
);
|
|
1659
1806
|
}
|
|
1660
1807
|
return new Promise((resolve, reject) => {
|
|
@@ -1694,6 +1841,10 @@ var HttpTransport = class {
|
|
|
1694
1841
|
* Stop the server and close all active sessions
|
|
1695
1842
|
*/
|
|
1696
1843
|
async stop() {
|
|
1844
|
+
if (this.sweepTimer) {
|
|
1845
|
+
clearInterval(this.sweepTimer);
|
|
1846
|
+
this.sweepTimer = null;
|
|
1847
|
+
}
|
|
1697
1848
|
for (const [sessionId, transport] of this.state.transports) {
|
|
1698
1849
|
try {
|
|
1699
1850
|
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-LLIAIJPO.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"}
|