mongodb-mcp-server 1.0.0 → 1.0.2-prerelease.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.
Files changed (168) hide show
  1. package/README.md +25 -23
  2. package/dist/cjs/common/config.d.ts +2 -1
  3. package/dist/cjs/common/config.d.ts.map +1 -1
  4. package/dist/cjs/common/config.js +5 -5
  5. package/dist/cjs/common/config.js.map +1 -1
  6. package/dist/cjs/common/connectionManager.d.ts +1 -10
  7. package/dist/cjs/common/connectionManager.d.ts.map +1 -1
  8. package/dist/cjs/common/connectionManager.js +17 -20
  9. package/dist/cjs/common/connectionManager.js.map +1 -1
  10. package/dist/cjs/common/logger.d.ts +2 -5
  11. package/dist/cjs/common/logger.d.ts.map +1 -1
  12. package/dist/cjs/common/logger.js +3 -10
  13. package/dist/cjs/common/logger.js.map +1 -1
  14. package/dist/cjs/common/packageInfo.js +1 -1
  15. package/dist/cjs/common/packageInfo.js.map +1 -1
  16. package/dist/cjs/helpers/collectCursorUntilMaxBytes.d.ts +24 -0
  17. package/dist/cjs/helpers/collectCursorUntilMaxBytes.d.ts.map +1 -0
  18. package/dist/cjs/helpers/collectCursorUntilMaxBytes.js +75 -0
  19. package/dist/cjs/helpers/collectCursorUntilMaxBytes.js.map +1 -0
  20. package/dist/cjs/helpers/constants.d.ts +24 -0
  21. package/dist/cjs/helpers/constants.d.ts.map +1 -0
  22. package/dist/cjs/helpers/constants.js +27 -0
  23. package/dist/cjs/helpers/constants.js.map +1 -0
  24. package/dist/cjs/helpers/isObjectEmpty.d.ts +6 -0
  25. package/dist/cjs/helpers/isObjectEmpty.d.ts.map +1 -0
  26. package/dist/cjs/helpers/isObjectEmpty.js +15 -0
  27. package/dist/cjs/helpers/isObjectEmpty.js.map +1 -0
  28. package/dist/cjs/helpers/operationWithFallback.d.ts +4 -0
  29. package/dist/cjs/helpers/operationWithFallback.d.ts.map +1 -0
  30. package/dist/cjs/helpers/operationWithFallback.js +12 -0
  31. package/dist/cjs/helpers/operationWithFallback.js.map +1 -0
  32. package/dist/cjs/server.d.ts +2 -6
  33. package/dist/cjs/server.d.ts.map +1 -1
  34. package/dist/cjs/server.js +36 -12
  35. package/dist/cjs/server.js.map +1 -1
  36. package/dist/cjs/tools/args.d.ts +1 -0
  37. package/dist/cjs/tools/args.d.ts.map +1 -1
  38. package/dist/cjs/tools/args.js +11 -0
  39. package/dist/cjs/tools/args.js.map +1 -1
  40. package/dist/cjs/tools/mongodb/connect/connect.d.ts +1 -1
  41. package/dist/cjs/tools/mongodb/connect/connect.d.ts.map +1 -1
  42. package/dist/cjs/tools/mongodb/connect/connect.js +21 -11
  43. package/dist/cjs/tools/mongodb/connect/connect.js.map +1 -1
  44. package/dist/cjs/tools/mongodb/create/insertMany.d.ts +1 -1
  45. package/dist/cjs/tools/mongodb/create/insertMany.d.ts.map +1 -1
  46. package/dist/cjs/tools/mongodb/create/insertMany.js +2 -1
  47. package/dist/cjs/tools/mongodb/create/insertMany.js.map +1 -1
  48. package/dist/cjs/tools/mongodb/delete/deleteMany.d.ts +3 -4
  49. package/dist/cjs/tools/mongodb/delete/deleteMany.d.ts.map +1 -1
  50. package/dist/cjs/tools/mongodb/delete/deleteMany.js +2 -4
  51. package/dist/cjs/tools/mongodb/delete/deleteMany.js.map +1 -1
  52. package/dist/cjs/tools/mongodb/metadata/collectionSchema.d.ts +8 -5
  53. package/dist/cjs/tools/mongodb/metadata/collectionSchema.d.ts.map +1 -1
  54. package/dist/cjs/tools/mongodb/metadata/collectionSchema.js +34 -6
  55. package/dist/cjs/tools/mongodb/metadata/collectionSchema.js.map +1 -1
  56. package/dist/cjs/tools/mongodb/metadata/explain.d.ts +51 -17
  57. package/dist/cjs/tools/mongodb/metadata/explain.d.ts.map +1 -1
  58. package/dist/cjs/tools/mongodb/metadata/explain.js +10 -9
  59. package/dist/cjs/tools/mongodb/metadata/explain.js.map +1 -1
  60. package/dist/cjs/tools/mongodb/read/aggregate.d.ts +9 -4
  61. package/dist/cjs/tools/mongodb/read/aggregate.d.ts.map +1 -1
  62. package/dist/cjs/tools/mongodb/read/aggregate.js +99 -14
  63. package/dist/cjs/tools/mongodb/read/aggregate.js.map +1 -1
  64. package/dist/cjs/tools/mongodb/read/count.d.ts +4 -5
  65. package/dist/cjs/tools/mongodb/read/count.d.ts.map +1 -1
  66. package/dist/cjs/tools/mongodb/read/count.js +2 -4
  67. package/dist/cjs/tools/mongodb/read/count.js.map +1 -1
  68. package/dist/cjs/tools/mongodb/read/export.d.ts +36 -10
  69. package/dist/cjs/tools/mongodb/read/export.d.ts.map +1 -1
  70. package/dist/cjs/tools/mongodb/read/find.d.ts +9 -4
  71. package/dist/cjs/tools/mongodb/read/find.d.ts.map +1 -1
  72. package/dist/cjs/tools/mongodb/read/find.js +95 -11
  73. package/dist/cjs/tools/mongodb/read/find.js.map +1 -1
  74. package/dist/cjs/tools/mongodb/update/updateMany.d.ts +2 -2
  75. package/dist/cjs/tools/mongodb/update/updateMany.d.ts.map +1 -1
  76. package/dist/cjs/tools/mongodb/update/updateMany.js +3 -7
  77. package/dist/cjs/tools/mongodb/update/updateMany.js.map +1 -1
  78. package/dist/cjs/tools/tool.d.ts +1 -0
  79. package/dist/cjs/tools/tool.d.ts.map +1 -1
  80. package/dist/cjs/tools/tool.js.map +1 -1
  81. package/dist/cjs/transports/stdio.d.ts +0 -9
  82. package/dist/cjs/transports/stdio.d.ts.map +1 -1
  83. package/dist/cjs/transports/stdio.js +2 -40
  84. package/dist/cjs/transports/stdio.js.map +1 -1
  85. package/dist/esm/common/config.d.ts +2 -1
  86. package/dist/esm/common/config.d.ts.map +1 -1
  87. package/dist/esm/common/config.js +4 -4
  88. package/dist/esm/common/config.js.map +1 -1
  89. package/dist/esm/common/connectionManager.d.ts +1 -10
  90. package/dist/esm/common/connectionManager.d.ts.map +1 -1
  91. package/dist/esm/common/connectionManager.js +17 -20
  92. package/dist/esm/common/connectionManager.js.map +1 -1
  93. package/dist/esm/common/logger.d.ts +2 -5
  94. package/dist/esm/common/logger.d.ts.map +1 -1
  95. package/dist/esm/common/logger.js +2 -8
  96. package/dist/esm/common/logger.js.map +1 -1
  97. package/dist/esm/common/packageInfo.js +1 -1
  98. package/dist/esm/common/packageInfo.js.map +1 -1
  99. package/dist/esm/helpers/collectCursorUntilMaxBytes.d.ts +24 -0
  100. package/dist/esm/helpers/collectCursorUntilMaxBytes.d.ts.map +1 -0
  101. package/dist/esm/helpers/collectCursorUntilMaxBytes.js +71 -0
  102. package/dist/esm/helpers/collectCursorUntilMaxBytes.js.map +1 -0
  103. package/dist/esm/helpers/constants.d.ts +24 -0
  104. package/dist/esm/helpers/constants.d.ts.map +1 -0
  105. package/dist/esm/helpers/constants.js +24 -0
  106. package/dist/esm/helpers/constants.js.map +1 -0
  107. package/dist/esm/helpers/isObjectEmpty.d.ts +6 -0
  108. package/dist/esm/helpers/isObjectEmpty.d.ts.map +1 -0
  109. package/dist/esm/helpers/isObjectEmpty.js +12 -0
  110. package/dist/esm/helpers/isObjectEmpty.js.map +1 -0
  111. package/dist/esm/helpers/operationWithFallback.d.ts +4 -0
  112. package/dist/esm/helpers/operationWithFallback.d.ts.map +1 -0
  113. package/dist/esm/helpers/operationWithFallback.js +9 -0
  114. package/dist/esm/helpers/operationWithFallback.js.map +1 -0
  115. package/dist/esm/server.d.ts +2 -6
  116. package/dist/esm/server.d.ts.map +1 -1
  117. package/dist/esm/server.js +36 -12
  118. package/dist/esm/server.js.map +1 -1
  119. package/dist/esm/tools/args.d.ts +1 -0
  120. package/dist/esm/tools/args.d.ts.map +1 -1
  121. package/dist/esm/tools/args.js +10 -0
  122. package/dist/esm/tools/args.js.map +1 -1
  123. package/dist/esm/tools/mongodb/connect/connect.d.ts +1 -1
  124. package/dist/esm/tools/mongodb/connect/connect.d.ts.map +1 -1
  125. package/dist/esm/tools/mongodb/connect/connect.js +21 -11
  126. package/dist/esm/tools/mongodb/connect/connect.js.map +1 -1
  127. package/dist/esm/tools/mongodb/create/insertMany.d.ts +1 -1
  128. package/dist/esm/tools/mongodb/create/insertMany.d.ts.map +1 -1
  129. package/dist/esm/tools/mongodb/create/insertMany.js +2 -1
  130. package/dist/esm/tools/mongodb/create/insertMany.js.map +1 -1
  131. package/dist/esm/tools/mongodb/delete/deleteMany.d.ts +3 -4
  132. package/dist/esm/tools/mongodb/delete/deleteMany.d.ts.map +1 -1
  133. package/dist/esm/tools/mongodb/delete/deleteMany.js +2 -4
  134. package/dist/esm/tools/mongodb/delete/deleteMany.js.map +1 -1
  135. package/dist/esm/tools/mongodb/metadata/collectionSchema.d.ts +8 -5
  136. package/dist/esm/tools/mongodb/metadata/collectionSchema.d.ts.map +1 -1
  137. package/dist/esm/tools/mongodb/metadata/collectionSchema.js +31 -6
  138. package/dist/esm/tools/mongodb/metadata/collectionSchema.js.map +1 -1
  139. package/dist/esm/tools/mongodb/metadata/explain.d.ts +51 -17
  140. package/dist/esm/tools/mongodb/metadata/explain.d.ts.map +1 -1
  141. package/dist/esm/tools/mongodb/metadata/explain.js +10 -9
  142. package/dist/esm/tools/mongodb/metadata/explain.js.map +1 -1
  143. package/dist/esm/tools/mongodb/read/aggregate.d.ts +9 -4
  144. package/dist/esm/tools/mongodb/read/aggregate.d.ts.map +1 -1
  145. package/dist/esm/tools/mongodb/read/aggregate.js +99 -14
  146. package/dist/esm/tools/mongodb/read/aggregate.js.map +1 -1
  147. package/dist/esm/tools/mongodb/read/count.d.ts +4 -5
  148. package/dist/esm/tools/mongodb/read/count.d.ts.map +1 -1
  149. package/dist/esm/tools/mongodb/read/count.js +2 -4
  150. package/dist/esm/tools/mongodb/read/count.js.map +1 -1
  151. package/dist/esm/tools/mongodb/read/export.d.ts +36 -10
  152. package/dist/esm/tools/mongodb/read/export.d.ts.map +1 -1
  153. package/dist/esm/tools/mongodb/read/find.d.ts +9 -4
  154. package/dist/esm/tools/mongodb/read/find.d.ts.map +1 -1
  155. package/dist/esm/tools/mongodb/read/find.js +95 -11
  156. package/dist/esm/tools/mongodb/read/find.js.map +1 -1
  157. package/dist/esm/tools/mongodb/update/updateMany.d.ts +2 -2
  158. package/dist/esm/tools/mongodb/update/updateMany.d.ts.map +1 -1
  159. package/dist/esm/tools/mongodb/update/updateMany.js +3 -7
  160. package/dist/esm/tools/mongodb/update/updateMany.js.map +1 -1
  161. package/dist/esm/tools/tool.d.ts +1 -0
  162. package/dist/esm/tools/tool.d.ts.map +1 -1
  163. package/dist/esm/tools/tool.js.map +1 -1
  164. package/dist/esm/transports/stdio.d.ts +0 -9
  165. package/dist/esm/transports/stdio.d.ts.map +1 -1
  166. package/dist/esm/transports/stdio.js +1 -37
  167. package/dist/esm/transports/stdio.js.map +1 -1
  168. package/package.json +14 -15
@@ -1,7 +1,6 @@
1
1
  import { DbOperationArgs, MongoDBToolBase } from "../mongodbTool.js";
2
2
  import { formatUntrustedData } from "../../tool.js";
3
3
  import { z } from "zod";
4
- import { ExplainVerbosity } from "mongodb";
5
4
  import { AggregateArgs } from "../read/aggregate.js";
6
5
  import { FindArgs } from "../read/find.js";
7
6
  import { CountArgs } from "../read/count.js";
@@ -28,10 +27,15 @@ export class ExplainTool extends MongoDBToolBase {
28
27
  }),
29
28
  ]))
30
29
  .describe("The method and its arguments to run"),
30
+ verbosity: z
31
+ .enum(["queryPlanner", "queryPlannerExtended", "executionStats", "allPlansExecution"])
32
+ .optional()
33
+ .default("queryPlanner")
34
+ .describe("The verbosity of the explain plan, defaults to queryPlanner. If the user wants to know how fast is a query in execution time, use executionStats. It supports all verbosities as defined in the MongoDB Driver."),
31
35
  };
32
36
  this.operationType = "metadata";
33
37
  }
34
- async execute({ database, collection, method: methods, }) {
38
+ async execute({ database, collection, method: methods, verbosity, }) {
35
39
  const provider = await this.ensureConnected();
36
40
  const method = methods[0];
37
41
  if (!method) {
@@ -45,14 +49,12 @@ export class ExplainTool extends MongoDBToolBase {
45
49
  .aggregate(database, collection, pipeline, {}, {
46
50
  writeConcern: undefined,
47
51
  })
48
- .explain(ExplainTool.defaultVerbosity);
52
+ .explain(verbosity);
49
53
  break;
50
54
  }
51
55
  case "find": {
52
56
  const { filter, ...rest } = method.arguments;
53
- result = await provider
54
- .find(database, collection, filter, { ...rest })
55
- .explain(ExplainTool.defaultVerbosity);
57
+ result = await provider.find(database, collection, filter, { ...rest }).explain(verbosity);
56
58
  break;
57
59
  }
58
60
  case "count": {
@@ -62,15 +64,14 @@ export class ExplainTool extends MongoDBToolBase {
62
64
  count: collection,
63
65
  query,
64
66
  },
65
- verbosity: ExplainTool.defaultVerbosity,
67
+ verbosity,
66
68
  });
67
69
  break;
68
70
  }
69
71
  }
70
72
  return {
71
- content: formatUntrustedData(`Here is some information about the winning plan chosen by the query optimizer for running the given \`${method.name}\` operation in "${database}.${collection}". This information can be used to understand how the query was executed and to optimize the query performance.`, JSON.stringify(result)),
73
+ content: formatUntrustedData(`Here is some information about the winning plan chosen by the query optimizer for running the given \`${method.name}\` operation in "${database}.${collection}". The execution plan was run with the following verbosity: "${verbosity}". This information can be used to understand how the query was executed and to optimize the query performance.`, JSON.stringify(result)),
72
74
  };
73
75
  }
74
76
  }
75
- ExplainTool.defaultVerbosity = ExplainVerbosity.queryPlanner;
76
77
  //# sourceMappingURL=explain.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"explain.js","sourceRoot":"","sources":["../../../../../src/tools/mongodb/metadata/explain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"explain.js","sourceRoot":"","sources":["../../../../../src/tools/mongodb/metadata/explain.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,25 @@
1
1
  import { z } from "zod";
2
2
  import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
3
3
  import { MongoDBToolBase } from "../mongodbTool.js";
4
- import type { ToolArgs, OperationType } from "../../tool.js";
4
+ import type { ToolArgs, OperationType, ToolExecutionContext } from "../../tool.js";
5
5
  export declare const AggregateArgs: {
6
- pipeline: z.ZodArray<z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>, "many">;
6
+ pipeline: z.ZodArray<z.AnyZodObject, "many">;
7
+ responseBytesLimit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
7
8
  };
8
9
  export declare class AggregateTool extends MongoDBToolBase {
9
10
  name: string;
10
11
  protected description: string;
11
12
  protected argsShape: {
12
- pipeline: z.ZodArray<z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>, "many">;
13
+ pipeline: z.ZodArray<z.AnyZodObject, "many">;
14
+ responseBytesLimit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
13
15
  database: z.ZodString;
14
16
  collection: z.ZodString;
15
17
  };
16
18
  operationType: OperationType;
17
- protected execute({ database, collection, pipeline, }: ToolArgs<typeof this.argsShape>): Promise<CallToolResult>;
19
+ protected execute({ database, collection, pipeline, responseBytesLimit }: ToolArgs<typeof this.argsShape>, { signal }: ToolExecutionContext): Promise<CallToolResult>;
20
+ private safeCloseCursor;
18
21
  private assertOnlyUsesPermittedStages;
22
+ private countAggregationResultDocuments;
23
+ private generateMessage;
19
24
  }
20
25
  //# sourceMappingURL=aggregate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mongodb/read/aggregate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAmB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAM7D,eAAO,MAAM,aAAa;;CAEzB,CAAC;AAEF,qBAAa,aAAc,SAAQ,eAAe;IACvC,IAAI,SAAe;IAC1B,SAAS,CAAC,WAAW,SAAqD;IAC1E,SAAS,CAAC,SAAS;;;;MAGjB;IACK,aAAa,EAAE,aAAa,CAAU;cAE7B,OAAO,CAAC,EACpB,QAAQ,EACR,UAAU,EACV,QAAQ,GACX,EAAE,QAAQ,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;IAwB5D,OAAO,CAAC,6BAA6B;CAqBxC"}
1
+ {"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mongodb/read/aggregate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,EAAmB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAWnF,eAAO,MAAM,aAAa;;;CAMzB,CAAC;AAEF,qBAAa,aAAc,SAAQ,eAAe;IACvC,IAAI,SAAe;IAC1B,SAAS,CAAC,WAAW,SAAqD;IAC1E,SAAS,CAAC,SAAS;;;;;MAGjB;IACK,aAAa,EAAE,aAAa,CAAU;cAE7B,OAAO,CACnB,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EAAE,QAAQ,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,EACvF,EAAE,MAAM,EAAE,EAAE,oBAAoB,GACjC,OAAO,CAAC,cAAc,CAAC;YA6DZ,eAAe;IAY7B,OAAO,CAAC,6BAA6B;YAsBvB,+BAA+B;IA+B7C,OAAO,CAAC,eAAe;CAqB1B"}
@@ -4,8 +4,17 @@ import { formatUntrustedData } from "../../tool.js";
4
4
  import { checkIndexUsage } from "../../../helpers/indexCheck.js";
5
5
  import { EJSON } from "bson";
6
6
  import { ErrorCodes, MongoDBError } from "../../../common/errors.js";
7
+ import { collectCursorUntilMaxBytesLimit } from "../../../helpers/collectCursorUntilMaxBytes.js";
8
+ import { operationWithFallback } from "../../../helpers/operationWithFallback.js";
9
+ import { AGG_COUNT_MAX_TIME_MS_CAP, ONE_MB, CURSOR_LIMITS_TO_LLM_TEXT } from "../../../helpers/constants.js";
10
+ import { zEJSON } from "../../args.js";
11
+ import { LogId } from "../../../common/logger.js";
7
12
  export const AggregateArgs = {
8
- pipeline: z.array(z.object({}).passthrough()).describe("An array of aggregation stages to execute"),
13
+ pipeline: z.array(zEJSON()).describe("An array of aggregation stages to execute"),
14
+ responseBytesLimit: z.number().optional().default(ONE_MB).describe(`\
15
+ The maximum number of bytes to return in the response. This value is capped by the server’s configured maxBytesPerQuery and cannot be exceeded. \
16
+ Note to LLM: If the entire aggregation result is required, use the "export" tool instead of increasing this limit.\
17
+ `),
9
18
  };
10
19
  export class AggregateTool extends MongoDBToolBase {
11
20
  constructor() {
@@ -18,21 +27,68 @@ export class AggregateTool extends MongoDBToolBase {
18
27
  };
19
28
  this.operationType = "read";
20
29
  }
21
- async execute({ database, collection, pipeline, }) {
22
- const provider = await this.ensureConnected();
23
- this.assertOnlyUsesPermittedStages(pipeline);
24
- // Check if aggregate operation uses an index if enabled
25
- if (this.config.indexCheck) {
26
- await checkIndexUsage(provider, database, collection, "aggregate", async () => {
27
- return provider
28
- .aggregate(database, collection, pipeline, {}, { writeConcern: undefined })
29
- .explain("queryPlanner");
30
+ async execute({ database, collection, pipeline, responseBytesLimit }, { signal }) {
31
+ let aggregationCursor = undefined;
32
+ try {
33
+ const provider = await this.ensureConnected();
34
+ this.assertOnlyUsesPermittedStages(pipeline);
35
+ // Check if aggregate operation uses an index if enabled
36
+ if (this.config.indexCheck) {
37
+ await checkIndexUsage(provider, database, collection, "aggregate", async () => {
38
+ return provider
39
+ .aggregate(database, collection, pipeline, {}, { writeConcern: undefined })
40
+ .explain("queryPlanner");
41
+ });
42
+ }
43
+ const cappedResultsPipeline = [...pipeline];
44
+ if (this.config.maxDocumentsPerQuery > 0) {
45
+ cappedResultsPipeline.push({ $limit: this.config.maxDocumentsPerQuery });
46
+ }
47
+ aggregationCursor = provider.aggregate(database, collection, cappedResultsPipeline);
48
+ const [totalDocuments, cursorResults] = await Promise.all([
49
+ this.countAggregationResultDocuments({ provider, database, collection, pipeline }),
50
+ collectCursorUntilMaxBytesLimit({
51
+ cursor: aggregationCursor,
52
+ configuredMaxBytesPerQuery: this.config.maxBytesPerQuery,
53
+ toolResponseBytesLimit: responseBytesLimit,
54
+ abortSignal: signal,
55
+ }),
56
+ ]);
57
+ // If the total number of documents that the aggregation would've
58
+ // resulted in would be greater than the configured
59
+ // maxDocumentsPerQuery then we know for sure that the results were
60
+ // capped.
61
+ const aggregationResultsCappedByMaxDocumentsLimit = this.config.maxDocumentsPerQuery > 0 &&
62
+ !!totalDocuments &&
63
+ totalDocuments > this.config.maxDocumentsPerQuery;
64
+ return {
65
+ content: formatUntrustedData(this.generateMessage({
66
+ aggResultsCount: totalDocuments,
67
+ documents: cursorResults.documents,
68
+ appliedLimits: [
69
+ aggregationResultsCappedByMaxDocumentsLimit ? "config.maxDocumentsPerQuery" : undefined,
70
+ cursorResults.cappedBy,
71
+ ].filter((limit) => !!limit),
72
+ }), cursorResults.documents.length > 0 ? EJSON.stringify(cursorResults.documents) : undefined),
73
+ };
74
+ }
75
+ finally {
76
+ if (aggregationCursor) {
77
+ void this.safeCloseCursor(aggregationCursor);
78
+ }
79
+ }
80
+ }
81
+ async safeCloseCursor(cursor) {
82
+ try {
83
+ await cursor.close();
84
+ }
85
+ catch (error) {
86
+ this.session.logger.warning({
87
+ id: LogId.mongodbCursorCloseError,
88
+ context: "aggregate tool",
89
+ message: `Error when closing the cursor - ${error instanceof Error ? error.message : String(error)}`,
30
90
  });
31
91
  }
32
- const documents = await provider.aggregate(database, collection, pipeline).toArray();
33
- return {
34
- content: formatUntrustedData(`The aggregation resulted in ${documents.length} documents.`, documents.length > 0 ? EJSON.stringify(documents) : undefined),
35
- };
36
92
  }
37
93
  assertOnlyUsesPermittedStages(pipeline) {
38
94
  const writeOperations = ["update", "create", "delete"];
@@ -53,5 +109,34 @@ export class AggregateTool extends MongoDBToolBase {
53
109
  }
54
110
  }
55
111
  }
112
+ async countAggregationResultDocuments({ provider, database, collection, pipeline, }) {
113
+ const resultsCountAggregation = [...pipeline, { $count: "totalDocuments" }];
114
+ return await operationWithFallback(async () => {
115
+ const aggregationResults = await provider
116
+ .aggregate(database, collection, resultsCountAggregation)
117
+ .maxTimeMS(AGG_COUNT_MAX_TIME_MS_CAP)
118
+ .toArray();
119
+ const documentWithCount = aggregationResults.length === 1 ? aggregationResults[0] : undefined;
120
+ const totalDocuments = documentWithCount &&
121
+ typeof documentWithCount === "object" &&
122
+ "totalDocuments" in documentWithCount &&
123
+ typeof documentWithCount.totalDocuments === "number"
124
+ ? documentWithCount.totalDocuments
125
+ : 0;
126
+ return totalDocuments;
127
+ }, undefined);
128
+ }
129
+ generateMessage({ aggResultsCount, documents, appliedLimits, }) {
130
+ const appliedLimitText = appliedLimits.length
131
+ ? `\
132
+ while respecting the applied limits of ${appliedLimits.map((limit) => CURSOR_LIMITS_TO_LLM_TEXT[limit]).join(", ")}. \
133
+ Note to LLM: If the entire query result is required then use "export" tool to export the query results.\
134
+ `
135
+ : "";
136
+ return `\
137
+ The aggregation resulted in ${aggResultsCount === undefined ? "indeterminable number of" : aggResultsCount} documents. \
138
+ Returning ${documents.length} documents${appliedLimitText ? ` ${appliedLimitText}` : "."}\
139
+ `;
140
+ }
56
141
  }
57
142
  //# sourceMappingURL=aggregate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../../../src/tools/mongodb/read/aggregate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAErE,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC;CACtG,CAAC;AAEF,MAAM,OAAO,aAAc,SAAQ,eAAe;IAAlD;;QACW,SAAI,GAAG,WAAW,CAAC;QAChB,gBAAW,GAAG,iDAAiD,CAAC;QAChE,cAAS,GAAG;YAClB,GAAG,eAAe;YAClB,GAAG,aAAa;SACnB,CAAC;QACK,kBAAa,GAAkB,MAAM,CAAC;IAmDjD,CAAC;IAjDa,KAAK,CAAC,OAAO,CAAC,EACpB,QAAQ,EACR,UAAU,EACV,QAAQ,GACsB;QAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAE9C,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QAE7C,wDAAwD;QACxD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzB,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE;gBAC1E,OAAO,QAAQ;qBACV,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;qBAC1E,OAAO,CAAC,cAAc,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;QACP,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;QAErF,OAAO;YACH,OAAO,EAAE,mBAAmB,CACxB,+BAA+B,SAAS,CAAC,MAAM,aAAa,EAC5D,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAChE;SACJ,CAAC;IACN,CAAC;IAEO,6BAA6B,CAAC,QAAmC;QACrE,MAAM,eAAe,GAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACxE,IAAI,wBAAwB,GAAG,EAAE,CAAC;QAElC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACvB,wBAAwB,GAAG,wEAAwE,CAAC;QACxG,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAkB,CAAC,CAAC,EAAE,CAAC;YAC7F,wBAAwB;gBACpB,qHAAqH,CAAC;QAC9H,CAAC;QAED,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAC5B,OAAO;QACX,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC7B,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC,uBAAuB,EAAE,wBAAwB,CAAC,CAAC;YACzF,CAAC;QACL,CAAC;IACL,CAAC;CACJ"}
1
+ {"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../../../src/tools/mongodb/read/aggregate.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,16 @@
1
1
  import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
2
  import { MongoDBToolBase } from "../mongodbTool.js";
3
3
  import type { ToolArgs, OperationType } from "../../tool.js";
4
- import { z } from "zod";
5
4
  export declare const CountArgs: {
6
- query: z.ZodOptional<z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>>;
5
+ query: import("zod").ZodOptional<import("zod").AnyZodObject>;
7
6
  };
8
7
  export declare class CountTool extends MongoDBToolBase {
9
8
  name: string;
10
9
  protected description: string;
11
10
  protected argsShape: {
12
- query: z.ZodOptional<z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>>;
13
- database: z.ZodString;
14
- collection: z.ZodString;
11
+ query: import("zod").ZodOptional<import("zod").AnyZodObject>;
12
+ database: import("zod").ZodString;
13
+ collection: import("zod").ZodString;
15
14
  };
16
15
  operationType: OperationType;
17
16
  protected execute({ database, collection, query }: ToolArgs<typeof this.argsShape>): Promise<CallToolResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"count.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mongodb/read/count.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAmB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,SAAS;;CAQrB,CAAC;AAEF,qBAAa,SAAU,SAAQ,eAAe;IACnC,IAAI,SAAW;IACtB,SAAS,CAAC,WAAW,SAC4G;IACjI,SAAS,CAAC,SAAS;;;;MAGjB;IAEK,aAAa,EAAE,aAAa,CAAU;cAE7B,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;CA2BrH"}
1
+ {"version":3,"file":"count.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mongodb/read/count.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAmB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI7D,eAAO,MAAM,SAAS;;CAMrB,CAAC;AAEF,qBAAa,SAAU,SAAQ,eAAe;IACnC,IAAI,SAAW;IACtB,SAAS,CAAC,WAAW,SAC4G;IACjI,SAAS,CAAC,SAAS;;;;MAGjB;IAEK,aAAa,EAAE,aAAa,CAAU;cAE7B,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;CA2BrH"}
@@ -1,10 +1,8 @@
1
1
  import { DbOperationArgs, MongoDBToolBase } from "../mongodbTool.js";
2
- import { z } from "zod";
3
2
  import { checkIndexUsage } from "../../../helpers/indexCheck.js";
3
+ import { zEJSON } from "../../args.js";
4
4
  export const CountArgs = {
5
- query: z
6
- .object({})
7
- .passthrough()
5
+ query: zEJSON()
8
6
  .optional()
9
7
  .describe("A filter/query parameter. Allows users to filter the documents to count. Matches the syntax of the filter argument of db.collection.count()."),
10
8
  };
@@ -1 +1 @@
1
- {"version":3,"file":"count.js","sourceRoot":"","sources":["../../../../../src/tools/mongodb/read/count.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,MAAM,CAAC,MAAM,SAAS,GAAG;IACrB,KAAK,EAAE,CAAC;SACH,MAAM,CAAC,EAAE,CAAC;SACV,WAAW,EAAE;SACb,QAAQ,EAAE;SACV,QAAQ,CACL,8IAA8I,CACjJ;CACR,CAAC;AAEF,MAAM,OAAO,SAAU,SAAQ,eAAe;IAA9C;;QACW,SAAI,GAAG,OAAO,CAAC;QACZ,gBAAW,GACjB,4HAA4H,CAAC;QACvH,cAAS,GAAG;YAClB,GAAG,eAAe;YAClB,GAAG,SAAS;SACf,CAAC;QAEK,kBAAa,GAAkB,MAAM,CAAC;IA6BjD,CAAC;IA3Ba,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAmC;QACpF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAE9C,oDAAoD;QACpD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzB,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE;gBACtE,OAAO,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,EAAE;oBAC1C,OAAO,EAAE;wBACL,KAAK,EAAE,UAAU;wBACjB,KAAK;qBACR;oBACD,SAAS,EAAE,cAAc;iBAC5B,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACP,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEhE,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,SAAS,KAAK,iCAAiC,UAAU,GAAG;oBAClE,IAAI,EAAE,MAAM;iBACf;aACJ;SACJ,CAAC;IACN,CAAC;CACJ"}
1
+ {"version":3,"file":"count.js","sourceRoot":"","sources":["../../../../../src/tools/mongodb/read/count.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,MAAM,CAAC,MAAM,SAAS,GAAG;IACrB,KAAK,EAAE,MAAM,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CACL,8IAA8I,CACjJ;CACR,CAAC;AAEF,MAAM,OAAO,SAAU,SAAQ,eAAe;IAA9C;;QACW,SAAI,GAAG,OAAO,CAAC;QACZ,gBAAW,GACjB,4HAA4H,CAAC;QACvH,cAAS,GAAG;YAClB,GAAG,eAAe;YAClB,GAAG,SAAS;SACf,CAAC;QAEK,kBAAa,GAAkB,MAAM,CAAC;IA6BjD,CAAC;IA3Ba,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAmC;QACpF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAE9C,oDAAoD;QACpD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzB,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE;gBACtE,OAAO,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,EAAE;oBAC1C,OAAO,EAAE;wBACL,KAAK,EAAE,UAAU;wBACjB,KAAK;qBACR;oBACD,SAAS,EAAE,cAAc;iBAC5B,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACP,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEhE,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,SAAS,KAAK,iCAAiC,UAAU,GAAG;oBAClE,IAAI,EAAE,MAAM;iBACf;aACJ;SACJ,CAAC;IACN,CAAC;CACJ"}
@@ -11,25 +11,35 @@ export declare class ExportTool extends MongoDBToolBase {
11
11
  name: z.ZodLiteral<"find">;
12
12
  arguments: z.ZodObject<{
13
13
  limit: z.ZodOptional<z.ZodNumber>;
14
- filter: z.ZodOptional<z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>>;
14
+ filter: z.ZodOptional<z.AnyZodObject>;
15
15
  projection: z.ZodOptional<z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>>;
16
16
  sort: z.ZodOptional<z.ZodObject<{}, "strip", z.ZodType<import("mongodb").SortDirection, z.ZodTypeDef, import("mongodb").SortDirection>, {}, {}>>;
17
+ responseBytesLimit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
17
18
  }, "strip", z.ZodTypeAny, {
19
+ responseBytesLimit: number;
18
20
  sort?: {} | undefined;
19
- filter?: z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
21
+ filter?: {
22
+ [x: string]: any;
23
+ } | undefined;
20
24
  limit?: number | undefined;
21
25
  projection?: z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
22
26
  }, {
23
27
  sort?: {} | undefined;
24
- filter?: z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
28
+ filter?: {
29
+ [x: string]: any;
30
+ } | undefined;
25
31
  limit?: number | undefined;
32
+ responseBytesLimit?: number | undefined;
26
33
  projection?: z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
27
34
  }>;
28
35
  }, "strip", z.ZodTypeAny, {
29
36
  name: "find";
30
37
  arguments: {
38
+ responseBytesLimit: number;
31
39
  sort?: {} | undefined;
32
- filter?: z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
40
+ filter?: {
41
+ [x: string]: any;
42
+ } | undefined;
33
43
  limit?: number | undefined;
34
44
  projection?: z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
35
45
  };
@@ -37,28 +47,44 @@ export declare class ExportTool extends MongoDBToolBase {
37
47
  name: "find";
38
48
  arguments: {
39
49
  sort?: {} | undefined;
40
- filter?: z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
50
+ filter?: {
51
+ [x: string]: any;
52
+ } | undefined;
41
53
  limit?: number | undefined;
54
+ responseBytesLimit?: number | undefined;
42
55
  projection?: z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
43
56
  };
44
57
  }>, z.ZodObject<{
45
58
  name: z.ZodLiteral<"aggregate">;
46
59
  arguments: z.ZodObject<{
47
- pipeline: z.ZodArray<z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>, "many">;
60
+ pipeline: z.ZodArray<z.AnyZodObject, "many">;
61
+ responseBytesLimit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
48
62
  }, "strip", z.ZodTypeAny, {
49
- pipeline: z.objectOutputType<{}, z.ZodTypeAny, "passthrough">[];
63
+ responseBytesLimit: number;
64
+ pipeline: {
65
+ [x: string]: any;
66
+ }[];
50
67
  }, {
51
- pipeline: z.objectInputType<{}, z.ZodTypeAny, "passthrough">[];
68
+ pipeline: {
69
+ [x: string]: any;
70
+ }[];
71
+ responseBytesLimit?: number | undefined;
52
72
  }>;
53
73
  }, "strip", z.ZodTypeAny, {
54
74
  name: "aggregate";
55
75
  arguments: {
56
- pipeline: z.objectOutputType<{}, z.ZodTypeAny, "passthrough">[];
76
+ responseBytesLimit: number;
77
+ pipeline: {
78
+ [x: string]: any;
79
+ }[];
57
80
  };
58
81
  }, {
59
82
  name: "aggregate";
60
83
  arguments: {
61
- pipeline: z.objectInputType<{}, z.ZodTypeAny, "passthrough">[];
84
+ pipeline: {
85
+ [x: string]: any;
86
+ }[];
87
+ responseBytesLimit?: number | undefined;
62
88
  };
63
89
  }>]>, "many">;
64
90
  jsonExportFormat: z.ZodDefault<z.ZodEnum<["relaxed", "canonical"]>>;
@@ -1 +1 @@
1
- {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mongodb/read/export.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAGpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAmB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKrE,qBAAa,UAAW,SAAQ,eAAe;IACpC,IAAI,SAAY;IACvB,SAAS,CAAC,WAAW,SAA0E;IAC/F,SAAS,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmCjB;IACK,aAAa,EAAE,aAAa,CAAU;cAE7B,OAAO,CAAC,EACpB,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,YAAY,EAAE,MAAM,GACvB,EAAE,QAAQ,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;IAoE5D,OAAO,CAAC,sBAAsB;CAGjC"}
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mongodb/read/export.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAGpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAmB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKrE,qBAAa,UAAW,SAAQ,eAAe;IACpC,IAAI,SAAY;IACvB,SAAS,CAAC,WAAW,SAA0E;IAC/F,SAAS,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmCjB;IACK,aAAa,EAAE,aAAa,CAAU;cAE7B,OAAO,CAAC,EACpB,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,YAAY,EAAE,MAAM,GACvB,EAAE,QAAQ,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;IAoE5D,OAAO,CAAC,sBAAsB;CAGjC"}
@@ -1,26 +1,31 @@
1
1
  import { z } from "zod";
2
2
  import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
3
3
  import { MongoDBToolBase } from "../mongodbTool.js";
4
- import type { ToolArgs, OperationType } from "../../tool.js";
4
+ import type { ToolArgs, OperationType, ToolExecutionContext } from "../../tool.js";
5
5
  import type { SortDirection } from "mongodb";
6
6
  export declare const FindArgs: {
7
- filter: z.ZodOptional<z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>>;
7
+ filter: z.ZodOptional<z.AnyZodObject>;
8
8
  projection: z.ZodOptional<z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>>;
9
9
  limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
10
10
  sort: z.ZodOptional<z.ZodObject<{}, "strip", z.ZodType<SortDirection, z.ZodTypeDef, SortDirection>, {}, {}>>;
11
+ responseBytesLimit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
11
12
  };
12
13
  export declare class FindTool extends MongoDBToolBase {
13
14
  name: string;
14
15
  protected description: string;
15
16
  protected argsShape: {
16
- filter: z.ZodOptional<z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>>;
17
+ filter: z.ZodOptional<z.AnyZodObject>;
17
18
  projection: z.ZodOptional<z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>>;
18
19
  limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
19
20
  sort: z.ZodOptional<z.ZodObject<{}, "strip", z.ZodType<SortDirection, z.ZodTypeDef, SortDirection>, {}, {}>>;
21
+ responseBytesLimit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
20
22
  database: z.ZodString;
21
23
  collection: z.ZodString;
22
24
  };
23
25
  operationType: OperationType;
24
- protected execute({ database, collection, filter, projection, limit, sort, }: ToolArgs<typeof this.argsShape>): Promise<CallToolResult>;
26
+ protected execute({ database, collection, filter, projection, limit, sort, responseBytesLimit }: ToolArgs<typeof this.argsShape>, { signal }: ToolExecutionContext): Promise<CallToolResult>;
27
+ private safeCloseCursor;
28
+ private generateMessage;
29
+ private getLimitForFindCursor;
25
30
  }
26
31
  //# sourceMappingURL=find.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mongodb/read/find.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAmB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAI7C,eAAO,MAAM,QAAQ;;;;;CAmBpB,CAAC;AAEF,qBAAa,QAAS,SAAQ,eAAe;IAClC,IAAI,SAAU;IACrB,SAAS,CAAC,WAAW,SAAmD;IACxE,SAAS,CAAC,SAAS;;;;;;;MAGjB;IACK,aAAa,EAAE,aAAa,CAAU;cAE7B,OAAO,CAAC,EACpB,QAAQ,EACR,UAAU,EACV,MAAM,EACN,UAAU,EACV,KAAK,EACL,IAAI,GACP,EAAE,QAAQ,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;CAmB/D"}
1
+ {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mongodb/read/find.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAmB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAEnF,OAAO,KAAK,EAAc,aAAa,EAAE,MAAM,SAAS,CAAC;AASzD,eAAO,MAAM,QAAQ;;;;;;CAqBpB,CAAC;AAEF,qBAAa,QAAS,SAAQ,eAAe;IAClC,IAAI,SAAU;IACrB,SAAS,CAAC,WAAW,SAAmD;IACxE,SAAS,CAAC,SAAS;;;;;;;;MAGjB;IACK,aAAa,EAAE,aAAa,CAAU;cAE7B,OAAO,CACnB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,QAAQ,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,EAC9G,EAAE,MAAM,EAAE,EAAE,oBAAoB,GACjC,OAAO,CAAC,cAAc,CAAC;YA6DZ,eAAe;IAY7B,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,qBAAqB;CAuBhC"}
@@ -3,10 +3,13 @@ import { DbOperationArgs, MongoDBToolBase } from "../mongodbTool.js";
3
3
  import { formatUntrustedData } from "../../tool.js";
4
4
  import { checkIndexUsage } from "../../../helpers/indexCheck.js";
5
5
  import { EJSON } from "bson";
6
+ import { collectCursorUntilMaxBytesLimit } from "../../../helpers/collectCursorUntilMaxBytes.js";
7
+ import { operationWithFallback } from "../../../helpers/operationWithFallback.js";
8
+ import { ONE_MB, QUERY_COUNT_MAX_TIME_MS_CAP, CURSOR_LIMITS_TO_LLM_TEXT } from "../../../helpers/constants.js";
9
+ import { zEJSON } from "../../args.js";
10
+ import { LogId } from "../../../common/logger.js";
6
11
  export const FindArgs = {
7
- filter: z
8
- .object({})
9
- .passthrough()
12
+ filter: zEJSON()
10
13
  .optional()
11
14
  .describe("The query filter, matching the syntax of the query argument of db.collection.find()"),
12
15
  projection: z
@@ -20,6 +23,10 @@ export const FindArgs = {
20
23
  .catchall(z.custom())
21
24
  .optional()
22
25
  .describe("A document, describing the sort order, matching the syntax of the sort argument of cursor.sort(). The keys of the object are the fields to sort on, while the values are the sort directions (1 for ascending, -1 for descending)."),
26
+ responseBytesLimit: z.number().optional().default(ONE_MB).describe(`\
27
+ The maximum number of bytes to return in the response. This value is capped by the server’s configured maxBytesPerQuery and cannot be exceeded. \
28
+ Note to LLM: If the entire query result is required, use the "export" tool instead of increasing this limit.\
29
+ `),
23
30
  };
24
31
  export class FindTool extends MongoDBToolBase {
25
32
  constructor() {
@@ -32,17 +39,94 @@ export class FindTool extends MongoDBToolBase {
32
39
  };
33
40
  this.operationType = "read";
34
41
  }
35
- async execute({ database, collection, filter, projection, limit, sort, }) {
36
- const provider = await this.ensureConnected();
37
- // Check if find operation uses an index if enabled
38
- if (this.config.indexCheck) {
39
- await checkIndexUsage(provider, database, collection, "find", async () => {
40
- return provider.find(database, collection, filter, { projection, limit, sort }).explain("queryPlanner");
42
+ async execute({ database, collection, filter, projection, limit, sort, responseBytesLimit }, { signal }) {
43
+ let findCursor = undefined;
44
+ try {
45
+ const provider = await this.ensureConnected();
46
+ // Check if find operation uses an index if enabled
47
+ if (this.config.indexCheck) {
48
+ await checkIndexUsage(provider, database, collection, "find", async () => {
49
+ return provider
50
+ .find(database, collection, filter, { projection, limit, sort })
51
+ .explain("queryPlanner");
52
+ });
53
+ }
54
+ const limitOnFindCursor = this.getLimitForFindCursor(limit);
55
+ findCursor = provider.find(database, collection, filter, {
56
+ projection,
57
+ limit: limitOnFindCursor.limit,
58
+ sort,
41
59
  });
60
+ const [queryResultsCount, cursorResults] = await Promise.all([
61
+ operationWithFallback(() => provider.countDocuments(database, collection, filter, {
62
+ // We should be counting documents that the original
63
+ // query would have yielded which is why we don't
64
+ // use `limitOnFindCursor` calculated above, only
65
+ // the limit provided to the tool.
66
+ limit,
67
+ maxTimeMS: QUERY_COUNT_MAX_TIME_MS_CAP,
68
+ }), undefined),
69
+ collectCursorUntilMaxBytesLimit({
70
+ cursor: findCursor,
71
+ configuredMaxBytesPerQuery: this.config.maxBytesPerQuery,
72
+ toolResponseBytesLimit: responseBytesLimit,
73
+ abortSignal: signal,
74
+ }),
75
+ ]);
76
+ return {
77
+ content: formatUntrustedData(this.generateMessage({
78
+ collection,
79
+ queryResultsCount,
80
+ documents: cursorResults.documents,
81
+ appliedLimits: [limitOnFindCursor.cappedBy, cursorResults.cappedBy].filter((limit) => !!limit),
82
+ }), cursorResults.documents.length > 0 ? EJSON.stringify(cursorResults.documents) : undefined),
83
+ };
84
+ }
85
+ finally {
86
+ if (findCursor) {
87
+ void this.safeCloseCursor(findCursor);
88
+ }
89
+ }
90
+ }
91
+ async safeCloseCursor(cursor) {
92
+ try {
93
+ await cursor.close();
94
+ }
95
+ catch (error) {
96
+ this.session.logger.warning({
97
+ id: LogId.mongodbCursorCloseError,
98
+ context: "find tool",
99
+ message: `Error when closing the cursor - ${error instanceof Error ? error.message : String(error)}`,
100
+ });
101
+ }
102
+ }
103
+ generateMessage({ collection, queryResultsCount, documents, appliedLimits, }) {
104
+ const appliedLimitsText = appliedLimits.length
105
+ ? `\
106
+ while respecting the applied limits of ${appliedLimits.map((limit) => CURSOR_LIMITS_TO_LLM_TEXT[limit]).join(", ")}. \
107
+ Note to LLM: If the entire query result is required then use "export" tool to export the query results.\
108
+ `
109
+ : "";
110
+ return `\
111
+ Query on collection "${collection}" resulted in ${queryResultsCount === undefined ? "indeterminable number of" : queryResultsCount} documents. \
112
+ Returning ${documents.length} documents${appliedLimitsText ? ` ${appliedLimitsText}` : "."}\
113
+ `;
114
+ }
115
+ getLimitForFindCursor(providedLimit) {
116
+ const configuredLimit = parseInt(String(this.config.maxDocumentsPerQuery), 10);
117
+ // Setting configured maxDocumentsPerQuery to negative, zero or nullish
118
+ // is equivalent to disabling the max limit applied on documents
119
+ const configuredLimitIsNotApplicable = Number.isNaN(configuredLimit) || configuredLimit <= 0;
120
+ if (configuredLimitIsNotApplicable) {
121
+ return { cappedBy: undefined, limit: providedLimit ?? undefined };
122
+ }
123
+ const providedLimitIsNotApplicable = providedLimit === null || providedLimit === undefined;
124
+ if (providedLimitIsNotApplicable) {
125
+ return { cappedBy: "config.maxDocumentsPerQuery", limit: configuredLimit };
42
126
  }
43
- const documents = await provider.find(database, collection, filter, { projection, limit, sort }).toArray();
44
127
  return {
45
- content: formatUntrustedData(`Found ${documents.length} documents in the collection "${collection}".`, documents.length > 0 ? EJSON.stringify(documents) : undefined),
128
+ cappedBy: configuredLimit < providedLimit ? "config.maxDocumentsPerQuery" : undefined,
129
+ limit: Math.min(providedLimit, configuredLimit),
46
130
  };
47
131
  }
48
132
  }
@@ -1 +1 @@
1
- {"version":3,"file":"find.js","sourceRoot":"","sources":["../../../../../src/tools/mongodb/read/find.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAE7B,MAAM,CAAC,MAAM,QAAQ,GAAG;IACpB,MAAM,EAAE,CAAC;SACJ,MAAM,CAAC,EAAE,CAAC;SACV,WAAW,EAAE;SACb,QAAQ,EAAE;SACV,QAAQ,CAAC,qFAAqF,CAAC;IACpG,UAAU,EAAE,CAAC;SACR,MAAM,CAAC,EAAE,CAAC;SACV,WAAW,EAAE;SACb,QAAQ,EAAE;SACV,QAAQ,CAAC,wFAAwF,CAAC;IACvG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IAC9F,IAAI,EAAE,CAAC;SACF,MAAM,CAAC,EAAE,CAAC;SACV,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAiB,CAAC;SACnC,QAAQ,EAAE;SACV,QAAQ,CACL,oOAAoO,CACvO;CACR,CAAC;AAEF,MAAM,OAAO,QAAS,SAAQ,eAAe;IAA7C;;QACW,SAAI,GAAG,MAAM,CAAC;QACX,gBAAW,GAAG,+CAA+C,CAAC;QAC9D,cAAS,GAAG;YAClB,GAAG,eAAe;YAClB,GAAG,QAAQ;SACd,CAAC;QACK,kBAAa,GAAkB,MAAM,CAAC;IA4BjD,CAAC;IA1Ba,KAAK,CAAC,OAAO,CAAC,EACpB,QAAQ,EACR,UAAU,EACV,MAAM,EACN,UAAU,EACV,KAAK,EACL,IAAI,GAC0B;QAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAE9C,mDAAmD;QACnD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzB,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE;gBACrE,OAAO,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YAC5G,CAAC,CAAC,CAAC;QACP,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QAE3G,OAAO;YACH,OAAO,EAAE,mBAAmB,CACxB,SAAS,SAAS,CAAC,MAAM,iCAAiC,UAAU,IAAI,EACxE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAChE;SACJ,CAAC;IACN,CAAC;CACJ"}
1
+ {"version":3,"file":"find.js","sourceRoot":"","sources":["../../../../../src/tools/mongodb/read/find.ts"],"names":[],"mappings":"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"}