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.
- package/README.md +25 -23
- package/dist/cjs/common/config.d.ts +2 -1
- package/dist/cjs/common/config.d.ts.map +1 -1
- package/dist/cjs/common/config.js +5 -5
- package/dist/cjs/common/config.js.map +1 -1
- package/dist/cjs/common/connectionManager.d.ts +1 -10
- package/dist/cjs/common/connectionManager.d.ts.map +1 -1
- package/dist/cjs/common/connectionManager.js +17 -20
- package/dist/cjs/common/connectionManager.js.map +1 -1
- package/dist/cjs/common/logger.d.ts +2 -5
- package/dist/cjs/common/logger.d.ts.map +1 -1
- package/dist/cjs/common/logger.js +3 -10
- package/dist/cjs/common/logger.js.map +1 -1
- package/dist/cjs/common/packageInfo.js +1 -1
- package/dist/cjs/common/packageInfo.js.map +1 -1
- package/dist/cjs/helpers/collectCursorUntilMaxBytes.d.ts +24 -0
- package/dist/cjs/helpers/collectCursorUntilMaxBytes.d.ts.map +1 -0
- package/dist/cjs/helpers/collectCursorUntilMaxBytes.js +75 -0
- package/dist/cjs/helpers/collectCursorUntilMaxBytes.js.map +1 -0
- package/dist/cjs/helpers/constants.d.ts +24 -0
- package/dist/cjs/helpers/constants.d.ts.map +1 -0
- package/dist/cjs/helpers/constants.js +27 -0
- package/dist/cjs/helpers/constants.js.map +1 -0
- package/dist/cjs/helpers/isObjectEmpty.d.ts +6 -0
- package/dist/cjs/helpers/isObjectEmpty.d.ts.map +1 -0
- package/dist/cjs/helpers/isObjectEmpty.js +15 -0
- package/dist/cjs/helpers/isObjectEmpty.js.map +1 -0
- package/dist/cjs/helpers/operationWithFallback.d.ts +4 -0
- package/dist/cjs/helpers/operationWithFallback.d.ts.map +1 -0
- package/dist/cjs/helpers/operationWithFallback.js +12 -0
- package/dist/cjs/helpers/operationWithFallback.js.map +1 -0
- package/dist/cjs/server.d.ts +2 -6
- package/dist/cjs/server.d.ts.map +1 -1
- package/dist/cjs/server.js +36 -12
- package/dist/cjs/server.js.map +1 -1
- package/dist/cjs/tools/args.d.ts +1 -0
- package/dist/cjs/tools/args.d.ts.map +1 -1
- package/dist/cjs/tools/args.js +11 -0
- package/dist/cjs/tools/args.js.map +1 -1
- package/dist/cjs/tools/mongodb/connect/connect.d.ts +1 -1
- package/dist/cjs/tools/mongodb/connect/connect.d.ts.map +1 -1
- package/dist/cjs/tools/mongodb/connect/connect.js +21 -11
- package/dist/cjs/tools/mongodb/connect/connect.js.map +1 -1
- package/dist/cjs/tools/mongodb/create/insertMany.d.ts +1 -1
- package/dist/cjs/tools/mongodb/create/insertMany.d.ts.map +1 -1
- package/dist/cjs/tools/mongodb/create/insertMany.js +2 -1
- package/dist/cjs/tools/mongodb/create/insertMany.js.map +1 -1
- package/dist/cjs/tools/mongodb/delete/deleteMany.d.ts +3 -4
- package/dist/cjs/tools/mongodb/delete/deleteMany.d.ts.map +1 -1
- package/dist/cjs/tools/mongodb/delete/deleteMany.js +2 -4
- package/dist/cjs/tools/mongodb/delete/deleteMany.js.map +1 -1
- package/dist/cjs/tools/mongodb/metadata/collectionSchema.d.ts +8 -5
- package/dist/cjs/tools/mongodb/metadata/collectionSchema.d.ts.map +1 -1
- package/dist/cjs/tools/mongodb/metadata/collectionSchema.js +34 -6
- package/dist/cjs/tools/mongodb/metadata/collectionSchema.js.map +1 -1
- package/dist/cjs/tools/mongodb/metadata/explain.d.ts +51 -17
- package/dist/cjs/tools/mongodb/metadata/explain.d.ts.map +1 -1
- package/dist/cjs/tools/mongodb/metadata/explain.js +10 -9
- package/dist/cjs/tools/mongodb/metadata/explain.js.map +1 -1
- package/dist/cjs/tools/mongodb/read/aggregate.d.ts +9 -4
- package/dist/cjs/tools/mongodb/read/aggregate.d.ts.map +1 -1
- package/dist/cjs/tools/mongodb/read/aggregate.js +99 -14
- package/dist/cjs/tools/mongodb/read/aggregate.js.map +1 -1
- package/dist/cjs/tools/mongodb/read/count.d.ts +4 -5
- package/dist/cjs/tools/mongodb/read/count.d.ts.map +1 -1
- package/dist/cjs/tools/mongodb/read/count.js +2 -4
- package/dist/cjs/tools/mongodb/read/count.js.map +1 -1
- package/dist/cjs/tools/mongodb/read/export.d.ts +36 -10
- package/dist/cjs/tools/mongodb/read/export.d.ts.map +1 -1
- package/dist/cjs/tools/mongodb/read/find.d.ts +9 -4
- package/dist/cjs/tools/mongodb/read/find.d.ts.map +1 -1
- package/dist/cjs/tools/mongodb/read/find.js +95 -11
- package/dist/cjs/tools/mongodb/read/find.js.map +1 -1
- package/dist/cjs/tools/mongodb/update/updateMany.d.ts +2 -2
- package/dist/cjs/tools/mongodb/update/updateMany.d.ts.map +1 -1
- package/dist/cjs/tools/mongodb/update/updateMany.js +3 -7
- package/dist/cjs/tools/mongodb/update/updateMany.js.map +1 -1
- package/dist/cjs/tools/tool.d.ts +1 -0
- package/dist/cjs/tools/tool.d.ts.map +1 -1
- package/dist/cjs/tools/tool.js.map +1 -1
- package/dist/cjs/transports/stdio.d.ts +0 -9
- package/dist/cjs/transports/stdio.d.ts.map +1 -1
- package/dist/cjs/transports/stdio.js +2 -40
- package/dist/cjs/transports/stdio.js.map +1 -1
- package/dist/esm/common/config.d.ts +2 -1
- package/dist/esm/common/config.d.ts.map +1 -1
- package/dist/esm/common/config.js +4 -4
- package/dist/esm/common/config.js.map +1 -1
- package/dist/esm/common/connectionManager.d.ts +1 -10
- package/dist/esm/common/connectionManager.d.ts.map +1 -1
- package/dist/esm/common/connectionManager.js +17 -20
- package/dist/esm/common/connectionManager.js.map +1 -1
- package/dist/esm/common/logger.d.ts +2 -5
- package/dist/esm/common/logger.d.ts.map +1 -1
- package/dist/esm/common/logger.js +2 -8
- package/dist/esm/common/logger.js.map +1 -1
- package/dist/esm/common/packageInfo.js +1 -1
- package/dist/esm/common/packageInfo.js.map +1 -1
- package/dist/esm/helpers/collectCursorUntilMaxBytes.d.ts +24 -0
- package/dist/esm/helpers/collectCursorUntilMaxBytes.d.ts.map +1 -0
- package/dist/esm/helpers/collectCursorUntilMaxBytes.js +71 -0
- package/dist/esm/helpers/collectCursorUntilMaxBytes.js.map +1 -0
- package/dist/esm/helpers/constants.d.ts +24 -0
- package/dist/esm/helpers/constants.d.ts.map +1 -0
- package/dist/esm/helpers/constants.js +24 -0
- package/dist/esm/helpers/constants.js.map +1 -0
- package/dist/esm/helpers/isObjectEmpty.d.ts +6 -0
- package/dist/esm/helpers/isObjectEmpty.d.ts.map +1 -0
- package/dist/esm/helpers/isObjectEmpty.js +12 -0
- package/dist/esm/helpers/isObjectEmpty.js.map +1 -0
- package/dist/esm/helpers/operationWithFallback.d.ts +4 -0
- package/dist/esm/helpers/operationWithFallback.d.ts.map +1 -0
- package/dist/esm/helpers/operationWithFallback.js +9 -0
- package/dist/esm/helpers/operationWithFallback.js.map +1 -0
- package/dist/esm/server.d.ts +2 -6
- package/dist/esm/server.d.ts.map +1 -1
- package/dist/esm/server.js +36 -12
- package/dist/esm/server.js.map +1 -1
- package/dist/esm/tools/args.d.ts +1 -0
- package/dist/esm/tools/args.d.ts.map +1 -1
- package/dist/esm/tools/args.js +10 -0
- package/dist/esm/tools/args.js.map +1 -1
- package/dist/esm/tools/mongodb/connect/connect.d.ts +1 -1
- package/dist/esm/tools/mongodb/connect/connect.d.ts.map +1 -1
- package/dist/esm/tools/mongodb/connect/connect.js +21 -11
- package/dist/esm/tools/mongodb/connect/connect.js.map +1 -1
- package/dist/esm/tools/mongodb/create/insertMany.d.ts +1 -1
- package/dist/esm/tools/mongodb/create/insertMany.d.ts.map +1 -1
- package/dist/esm/tools/mongodb/create/insertMany.js +2 -1
- package/dist/esm/tools/mongodb/create/insertMany.js.map +1 -1
- package/dist/esm/tools/mongodb/delete/deleteMany.d.ts +3 -4
- package/dist/esm/tools/mongodb/delete/deleteMany.d.ts.map +1 -1
- package/dist/esm/tools/mongodb/delete/deleteMany.js +2 -4
- package/dist/esm/tools/mongodb/delete/deleteMany.js.map +1 -1
- package/dist/esm/tools/mongodb/metadata/collectionSchema.d.ts +8 -5
- package/dist/esm/tools/mongodb/metadata/collectionSchema.d.ts.map +1 -1
- package/dist/esm/tools/mongodb/metadata/collectionSchema.js +31 -6
- package/dist/esm/tools/mongodb/metadata/collectionSchema.js.map +1 -1
- package/dist/esm/tools/mongodb/metadata/explain.d.ts +51 -17
- package/dist/esm/tools/mongodb/metadata/explain.d.ts.map +1 -1
- package/dist/esm/tools/mongodb/metadata/explain.js +10 -9
- package/dist/esm/tools/mongodb/metadata/explain.js.map +1 -1
- package/dist/esm/tools/mongodb/read/aggregate.d.ts +9 -4
- package/dist/esm/tools/mongodb/read/aggregate.d.ts.map +1 -1
- package/dist/esm/tools/mongodb/read/aggregate.js +99 -14
- package/dist/esm/tools/mongodb/read/aggregate.js.map +1 -1
- package/dist/esm/tools/mongodb/read/count.d.ts +4 -5
- package/dist/esm/tools/mongodb/read/count.d.ts.map +1 -1
- package/dist/esm/tools/mongodb/read/count.js +2 -4
- package/dist/esm/tools/mongodb/read/count.js.map +1 -1
- package/dist/esm/tools/mongodb/read/export.d.ts +36 -10
- package/dist/esm/tools/mongodb/read/export.d.ts.map +1 -1
- package/dist/esm/tools/mongodb/read/find.d.ts +9 -4
- package/dist/esm/tools/mongodb/read/find.d.ts.map +1 -1
- package/dist/esm/tools/mongodb/read/find.js +95 -11
- package/dist/esm/tools/mongodb/read/find.js.map +1 -1
- package/dist/esm/tools/mongodb/update/updateMany.d.ts +2 -2
- package/dist/esm/tools/mongodb/update/updateMany.d.ts.map +1 -1
- package/dist/esm/tools/mongodb/update/updateMany.js +3 -7
- package/dist/esm/tools/mongodb/update/updateMany.js.map +1 -1
- package/dist/esm/tools/tool.d.ts +1 -0
- package/dist/esm/tools/tool.d.ts.map +1 -1
- package/dist/esm/tools/tool.js.map +1 -1
- package/dist/esm/transports/stdio.d.ts +0 -9
- package/dist/esm/transports/stdio.d.ts.map +1 -1
- package/dist/esm/transports/stdio.js +1 -37
- package/dist/esm/transports/stdio.js.map +1 -1
- 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(
|
|
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
|
|
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":"AACA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,
|
|
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.
|
|
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.
|
|
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
|
|
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;
|
|
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(
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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;
|
|
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:
|
|
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:
|
|
13
|
-
database:
|
|
14
|
-
collection:
|
|
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;
|
|
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:
|
|
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,
|
|
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.
|
|
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?:
|
|
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?:
|
|
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?:
|
|
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?:
|
|
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.
|
|
60
|
+
pipeline: z.ZodArray<z.AnyZodObject, "many">;
|
|
61
|
+
responseBytesLimit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
48
62
|
}, "strip", z.ZodTypeAny, {
|
|
49
|
-
|
|
63
|
+
responseBytesLimit: number;
|
|
64
|
+
pipeline: {
|
|
65
|
+
[x: string]: any;
|
|
66
|
+
}[];
|
|
50
67
|
}, {
|
|
51
|
-
pipeline:
|
|
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
|
-
|
|
76
|
+
responseBytesLimit: number;
|
|
77
|
+
pipeline: {
|
|
78
|
+
[x: string]: any;
|
|
79
|
+
}[];
|
|
57
80
|
};
|
|
58
81
|
}, {
|
|
59
82
|
name: "aggregate";
|
|
60
83
|
arguments: {
|
|
61
|
-
pipeline:
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
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;
|
|
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:
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"find.js","sourceRoot":"","sources":["../../../../../src/tools/mongodb/read/find.ts"],"names":[],"mappings":"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"}
|