diff --git a/src/tools/args.ts b/src/tools/args.ts index 11b5b8b8..a8daf8fa 100644 --- a/src/tools/args.ts +++ b/src/tools/args.ts @@ -84,3 +84,13 @@ function toEJSON(value: T): T { export function zEJSON(): z.AnyZodObject { return z.object({}).passthrough().transform(toEJSON) as unknown as z.AnyZodObject; } + +/** + * Serializes data to EJSON format with proper Int64 preservation. + * This function ensures that Int64 values are not truncated to JavaScript numbers. + * @param value The data to serialize + * @returns EJSON string with preserved Int64 precision + */ +export function serializeWithInt64Preservation(value: unknown): string { + return EJSON.stringify(value, undefined, undefined, { relaxed: false }); +} diff --git a/src/tools/mongodb/delete/deleteMany.ts b/src/tools/mongodb/delete/deleteMany.ts index 835cbb4a..a7385019 100644 --- a/src/tools/mongodb/delete/deleteMany.ts +++ b/src/tools/mongodb/delete/deleteMany.ts @@ -58,7 +58,7 @@ export class DeleteManyTool extends MongoDBToolBase { protected getConfirmationMessage({ database, collection, filter }: ToolArgs): string { const filterDescription = filter && Object.keys(filter).length > 0 - ? "```json\n" + `{ "filter": ${EJSON.stringify(filter)} }\n` + "```\n\n" + ? "```json\n" + `{ "filter": ${EJSON.stringify(filter, undefined, undefined, { relaxed: false })} }\n` + "```\n\n" : "- **All documents** (No filter)\n\n"; return ( `You are about to delete documents from the \`${collection}\` collection in the \`${database}\` database:\n\n` + diff --git a/src/tools/mongodb/metadata/dbStats.ts b/src/tools/mongodb/metadata/dbStats.ts index 830df410..5b34283e 100644 --- a/src/tools/mongodb/metadata/dbStats.ts +++ b/src/tools/mongodb/metadata/dbStats.ts @@ -21,7 +21,7 @@ export class DbStatsTool extends MongoDBToolBase { }); return { - content: formatUntrustedData(`Statistics for database ${database}`, EJSON.stringify(result)), + content: formatUntrustedData(`Statistics for database ${database}`, EJSON.stringify(result, undefined, undefined, { relaxed: false })), }; } } diff --git a/src/tools/mongodb/read/aggregate.ts b/src/tools/mongodb/read/aggregate.ts index c7bd439a..1be44993 100644 --- a/src/tools/mongodb/read/aggregate.ts +++ b/src/tools/mongodb/read/aggregate.ts @@ -138,7 +138,7 @@ export class AggregateTool extends MongoDBToolBase { cursorResults.cappedBy, ].filter((limit): limit is keyof typeof CURSOR_LIMITS_TO_LLM_TEXT => !!limit), }), - ...(cursorResults.documents.length > 0 ? [EJSON.stringify(cursorResults.documents)] : []) + ...(cursorResults.documents.length > 0 ? [EJSON.stringify(cursorResults.documents, undefined, undefined, { relaxed: false })] : []) ), }; } finally { diff --git a/src/tools/mongodb/read/find.ts b/src/tools/mongodb/read/find.ts index eb006f33..b4a543bc 100644 --- a/src/tools/mongodb/read/find.ts +++ b/src/tools/mongodb/read/find.ts @@ -98,7 +98,7 @@ export class FindTool extends MongoDBToolBase { documents: cursorResults.documents, appliedLimits: [limitOnFindCursor.cappedBy, cursorResults.cappedBy].filter((limit) => !!limit), }), - ...(cursorResults.documents.length > 0 ? [EJSON.stringify(cursorResults.documents)] : []) + ...(cursorResults.documents.length > 0 ? [EJSON.stringify(cursorResults.documents, undefined, undefined, { relaxed: false })] : []) ), }; } finally {