mongodb-mcp-server 0.0.4 → 0.0.6
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/.github/CODEOWNERS +3 -0
- package/.github/dependabot.yml +10 -0
- package/.github/workflows/code_health.yaml +53 -22
- package/.github/workflows/code_health_fork.yaml +106 -0
- package/.github/workflows/codeql.yml +34 -0
- package/.github/workflows/lint.yml +37 -0
- package/.github/workflows/prepare_release.yaml +6 -4
- package/.github/workflows/publish.yaml +6 -3
- package/.prettierrc.json +1 -1
- package/README.md +18 -0
- package/dist/common/atlas/apiClient.js +28 -4
- package/dist/common/atlas/apiClient.js.map +1 -1
- package/dist/config.js +4 -7
- package/dist/config.js.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.js +12 -7
- package/dist/index.js.map +1 -1
- package/dist/logger.js +72 -28
- package/dist/logger.js.map +1 -1
- package/dist/packageInfo.js +6 -0
- package/dist/packageInfo.js.map +1 -0
- package/dist/server.js +114 -10
- package/dist/server.js.map +1 -1
- package/dist/session.js +66 -16
- package/dist/session.js.map +1 -1
- package/dist/telemetry/constants.js +15 -0
- package/dist/telemetry/constants.js.map +1 -0
- package/dist/telemetry/eventCache.js +53 -0
- package/dist/telemetry/eventCache.js.map +1 -0
- package/dist/telemetry/telemetry.js +97 -0
- package/dist/telemetry/telemetry.js.map +1 -0
- package/dist/telemetry/types.js +2 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/tools/atlas/atlasTool.js +8 -3
- package/dist/tools/atlas/atlasTool.js.map +1 -1
- package/dist/tools/atlas/{createAccessList.js → create/createAccessList.js} +1 -2
- package/dist/tools/atlas/create/createAccessList.js.map +1 -0
- package/dist/tools/atlas/{createDBUser.js → create/createDBUser.js} +1 -2
- package/dist/tools/atlas/create/createDBUser.js.map +1 -0
- package/dist/tools/atlas/{createFreeCluster.js → create/createFreeCluster.js} +5 -3
- package/dist/tools/atlas/create/createFreeCluster.js.map +1 -0
- package/dist/tools/atlas/{createProject.js → create/createProject.js} +1 -2
- package/dist/tools/atlas/create/createProject.js.map +1 -0
- package/dist/tools/atlas/metadata/connectCluster.js +97 -0
- package/dist/tools/atlas/metadata/connectCluster.js.map +1 -0
- package/dist/tools/atlas/{inspectAccessList.js → read/inspectAccessList.js} +1 -2
- package/dist/tools/atlas/read/inspectAccessList.js.map +1 -0
- package/dist/tools/atlas/{inspectCluster.js → read/inspectCluster.js} +1 -2
- package/dist/tools/atlas/read/inspectCluster.js.map +1 -0
- package/dist/tools/atlas/{listClusters.js → read/listClusters.js} +1 -2
- package/dist/tools/atlas/read/listClusters.js.map +1 -0
- package/dist/tools/atlas/{listDBUsers.js → read/listDBUsers.js} +1 -2
- package/dist/tools/atlas/read/listDBUsers.js.map +1 -0
- package/dist/tools/atlas/{listOrgs.js → read/listOrgs.js} +1 -2
- package/dist/tools/atlas/read/listOrgs.js.map +1 -0
- package/dist/tools/atlas/{listProjects.js → read/listProjects.js} +11 -5
- package/dist/tools/atlas/read/listProjects.js.map +1 -0
- package/dist/tools/atlas/tools.js +12 -10
- package/dist/tools/atlas/tools.js.map +1 -1
- package/dist/tools/mongodb/create/insertMany.js +1 -1
- package/dist/tools/mongodb/create/insertMany.js.map +1 -1
- package/dist/tools/mongodb/delete/deleteMany.js +1 -2
- package/dist/tools/mongodb/delete/deleteMany.js.map +1 -1
- package/dist/tools/mongodb/metadata/collectionSchema.js +15 -13
- package/dist/tools/mongodb/metadata/collectionSchema.js.map +1 -1
- package/dist/tools/mongodb/metadata/collectionStorageSize.js +32 -3
- package/dist/tools/mongodb/metadata/collectionStorageSize.js.map +1 -1
- package/dist/tools/mongodb/metadata/connect.js +59 -72
- package/dist/tools/mongodb/metadata/connect.js.map +1 -1
- package/dist/tools/mongodb/metadata/dbStats.js +6 -1
- package/dist/tools/mongodb/metadata/dbStats.js.map +1 -1
- package/dist/tools/mongodb/metadata/explain.js +14 -7
- package/dist/tools/mongodb/metadata/explain.js.map +1 -1
- package/dist/tools/mongodb/metadata/logs.js +45 -0
- package/dist/tools/mongodb/metadata/logs.js.map +1 -0
- package/dist/tools/mongodb/mongodbTool.js +42 -36
- package/dist/tools/mongodb/mongodbTool.js.map +1 -1
- package/dist/tools/mongodb/read/aggregate.js +4 -4
- package/dist/tools/mongodb/read/aggregate.js.map +1 -1
- package/dist/tools/mongodb/read/collectionIndexes.js +24 -5
- package/dist/tools/mongodb/read/collectionIndexes.js.map +1 -1
- package/dist/tools/mongodb/read/count.js +1 -2
- package/dist/tools/mongodb/read/count.js.map +1 -1
- package/dist/tools/mongodb/read/find.js +5 -6
- package/dist/tools/mongodb/read/find.js.map +1 -1
- package/dist/tools/mongodb/tools.js +6 -2
- package/dist/tools/mongodb/tools.js.map +1 -1
- package/dist/tools/mongodb/update/renameCollection.js +28 -4
- package/dist/tools/mongodb/update/renameCollection.js.map +1 -1
- package/dist/tools/mongodb/update/updateMany.js +7 -11
- package/dist/tools/mongodb/update/updateMany.js.map +1 -1
- package/dist/tools/tool.js +68 -15
- package/dist/tools/tool.js.map +1 -1
- package/eslint.config.js +29 -10
- package/global.d.ts +1 -0
- package/package.json +7 -3
- package/scripts/apply.ts +9 -7
- package/scripts/filter.ts +3 -2
- package/src/common/atlas/apiClient.ts +44 -11
- package/src/config.ts +16 -17
- package/src/errors.ts +1 -1
- package/src/index.ts +12 -8
- package/src/logger.ts +92 -29
- package/src/packageInfo.ts +6 -0
- package/src/server.ts +160 -11
- package/src/session.ts +102 -22
- package/src/telemetry/constants.ts +15 -0
- package/src/telemetry/eventCache.ts +62 -0
- package/src/telemetry/telemetry.ts +125 -0
- package/src/telemetry/types.ts +77 -0
- package/src/tools/atlas/atlasTool.ts +7 -5
- package/src/tools/atlas/{createAccessList.ts → create/createAccessList.ts} +2 -4
- package/src/tools/atlas/{createDBUser.ts → create/createDBUser.ts} +3 -5
- package/src/tools/atlas/{createFreeCluster.ts → create/createFreeCluster.ts} +7 -6
- package/src/tools/atlas/{createProject.ts → create/createProject.ts} +3 -4
- package/src/tools/atlas/metadata/connectCluster.ts +114 -0
- package/src/tools/atlas/{inspectAccessList.ts → read/inspectAccessList.ts} +2 -4
- package/src/tools/atlas/{inspectCluster.ts → read/inspectCluster.ts} +3 -5
- package/src/tools/atlas/{listClusters.ts → read/listClusters.ts} +3 -5
- package/src/tools/atlas/{listDBUsers.ts → read/listDBUsers.ts} +3 -5
- package/src/tools/atlas/{listOrgs.ts → read/listOrgs.ts} +2 -4
- package/src/tools/atlas/{listProjects.ts → read/listProjects.ts} +15 -7
- package/src/tools/atlas/tools.ts +12 -10
- package/src/tools/mongodb/create/insertMany.ts +1 -1
- package/src/tools/mongodb/delete/deleteMany.ts +1 -2
- package/src/tools/mongodb/metadata/collectionSchema.ts +16 -14
- package/src/tools/mongodb/metadata/collectionStorageSize.ts +41 -3
- package/src/tools/mongodb/metadata/connect.ts +78 -76
- package/src/tools/mongodb/metadata/dbStats.ts +6 -1
- package/src/tools/mongodb/metadata/explain.ts +20 -7
- package/src/tools/mongodb/metadata/logs.ts +55 -0
- package/src/tools/mongodb/mongodbTool.ts +47 -40
- package/src/tools/mongodb/read/aggregate.ts +4 -4
- package/src/tools/mongodb/read/collectionIndexes.ts +29 -5
- package/src/tools/mongodb/read/count.ts +1 -2
- package/src/tools/mongodb/read/find.ts +5 -6
- package/src/tools/mongodb/tools.ts +6 -2
- package/src/tools/mongodb/update/renameCollection.ts +33 -4
- package/src/tools/mongodb/update/updateMany.ts +7 -11
- package/src/tools/tool.ts +89 -26
- package/tests/integration/helpers.ts +94 -107
- package/tests/integration/inMemoryTransport.ts +3 -2
- package/tests/integration/server.test.ts +75 -23
- package/tests/integration/tools/atlas/accessLists.test.ts +13 -15
- package/tests/integration/tools/atlas/atlasHelpers.ts +10 -13
- package/tests/integration/tools/atlas/clusters.test.ts +79 -16
- package/tests/integration/tools/atlas/dbUsers.test.ts +9 -9
- package/tests/integration/tools/atlas/orgs.test.ts +4 -4
- package/tests/integration/tools/atlas/projects.test.ts +10 -12
- package/tests/integration/tools/mongodb/create/createCollection.test.ts +19 -62
- package/tests/integration/tools/mongodb/create/createIndex.test.ts +41 -87
- package/tests/integration/tools/mongodb/create/insertMany.test.ts +35 -78
- package/tests/integration/tools/mongodb/delete/deleteMany.test.ts +25 -62
- package/tests/integration/tools/mongodb/delete/dropCollection.test.ts +22 -71
- package/tests/integration/tools/mongodb/delete/dropDatabase.test.ts +29 -63
- package/tests/integration/tools/mongodb/metadata/collectionSchema.test.ts +154 -0
- package/tests/integration/tools/mongodb/metadata/collectionStorageSize.test.ts +86 -0
- package/tests/integration/tools/mongodb/metadata/connect.test.ts +88 -93
- package/tests/integration/tools/mongodb/metadata/dbStats.test.ts +104 -0
- package/tests/integration/tools/mongodb/metadata/explain.test.ts +171 -0
- package/tests/integration/tools/mongodb/metadata/listCollections.test.ts +28 -56
- package/tests/integration/tools/mongodb/metadata/listDatabases.test.ts +32 -26
- package/tests/integration/tools/mongodb/metadata/logs.test.ts +83 -0
- package/tests/integration/tools/mongodb/mongodbHelpers.ts +176 -0
- package/tests/integration/tools/mongodb/read/aggregate.test.ts +99 -0
- package/tests/integration/tools/mongodb/read/collectionIndexes.test.ts +99 -0
- package/tests/integration/tools/mongodb/read/count.test.ts +31 -79
- package/tests/integration/tools/mongodb/read/find.test.ts +182 -0
- package/tests/integration/tools/mongodb/update/renameCollection.test.ts +194 -0
- package/tests/integration/tools/mongodb/update/updateMany.test.ts +238 -0
- package/tests/unit/telemetry.test.ts +200 -0
- package/tsconfig.jest.json +2 -1
- package/tsconfig.json +1 -1
- package/tsconfig.lint.json +8 -0
- package/dist/tools/atlas/createAccessList.js.map +0 -1
- package/dist/tools/atlas/createDBUser.js.map +0 -1
- package/dist/tools/atlas/createFreeCluster.js.map +0 -1
- package/dist/tools/atlas/createProject.js.map +0 -1
- package/dist/tools/atlas/inspectAccessList.js.map +0 -1
- package/dist/tools/atlas/inspectCluster.js.map +0 -1
- package/dist/tools/atlas/listClusters.js.map +0 -1
- package/dist/tools/atlas/listDBUsers.js.map +0 -1
- package/dist/tools/atlas/listOrgs.js.map +0 -1
- package/dist/tools/atlas/listProjects.js.map +0 -1
|
@@ -1,85 +1,72 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { MongoDBToolBase } from "../mongodbTool.js";
|
|
3
|
-
import
|
|
4
|
-
|
|
3
|
+
import assert from "assert";
|
|
4
|
+
const disconnectedSchema = z
|
|
5
|
+
.object({
|
|
6
|
+
connectionString: z.string().describe("MongoDB connection string (in the mongodb:// or mongodb+srv:// format)"),
|
|
7
|
+
})
|
|
8
|
+
.describe("Options for connecting to MongoDB.");
|
|
9
|
+
const connectedSchema = z
|
|
10
|
+
.object({
|
|
11
|
+
connectionString: z
|
|
12
|
+
.string()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("MongoDB connection string to switch to (in the mongodb:// or mongodb+srv:// format)"),
|
|
15
|
+
})
|
|
16
|
+
.describe("Options for switching the current MongoDB connection. If a connection string is not provided, the connection string from the config will be used.");
|
|
17
|
+
const connectedName = "switch-connection";
|
|
18
|
+
const disconnectedName = "connect";
|
|
19
|
+
const connectedDescription = "Switch to a different MongoDB connection. If the user has configured a connection string or has previously called the connect tool, a connection is already established and there's no need to call this tool unless the user has explicitly requested to switch to a new instance.";
|
|
20
|
+
const disconnectedDescription = "Connect to a MongoDB instance";
|
|
5
21
|
export class ConnectTool extends MongoDBToolBase {
|
|
6
|
-
constructor() {
|
|
7
|
-
super(
|
|
8
|
-
this.name =
|
|
9
|
-
this.description =
|
|
22
|
+
constructor(session, config, telemetry) {
|
|
23
|
+
super(session, config, telemetry);
|
|
24
|
+
this.name = disconnectedName;
|
|
25
|
+
this.description = disconnectedDescription;
|
|
26
|
+
// Here the default is empty just to trigger registration, but we're going to override it with the correct
|
|
27
|
+
// schema in the register method.
|
|
10
28
|
this.argsShape = {
|
|
11
|
-
|
|
12
|
-
.array(z
|
|
13
|
-
.union([
|
|
14
|
-
z.object({
|
|
15
|
-
connectionString: z
|
|
16
|
-
.string()
|
|
17
|
-
.describe("MongoDB connection string (in the mongodb:// or mongodb+srv:// format)"),
|
|
18
|
-
}),
|
|
19
|
-
z.object({
|
|
20
|
-
clusterName: z.string().describe("MongoDB cluster name"),
|
|
21
|
-
}),
|
|
22
|
-
])
|
|
23
|
-
.optional())
|
|
24
|
-
.optional()
|
|
25
|
-
.describe("Options for connecting to MongoDB. If not provided, the connection string from the config://connection-string resource will be used. If the user hasn't specified Atlas cluster name or a connection string explicitly and the `config://connection-string` resource is present, always invoke this with no arguments."),
|
|
29
|
+
connectionString: z.string().optional(),
|
|
26
30
|
};
|
|
27
31
|
this.operationType = "metadata";
|
|
32
|
+
session.on("close", () => {
|
|
33
|
+
this.updateMetadata();
|
|
34
|
+
});
|
|
28
35
|
}
|
|
29
|
-
async execute({
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
};
|
|
36
|
+
async execute({ connectionString }) {
|
|
37
|
+
switch (this.name) {
|
|
38
|
+
case disconnectedName:
|
|
39
|
+
assert(connectionString, "Connection string is required");
|
|
40
|
+
break;
|
|
41
|
+
case connectedName:
|
|
42
|
+
connectionString ?? (connectionString = this.config.connectionString);
|
|
43
|
+
assert(connectionString, "Cannot switch to a new connection because no connection string was provided and no default connection string is configured.");
|
|
44
|
+
break;
|
|
39
45
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
await this.connectToMongoDB(connectionString);
|
|
47
|
+
this.updateMetadata();
|
|
48
|
+
return {
|
|
49
|
+
content: [{ type: "text", text: "Successfully connected to MongoDB." }],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
register(server) {
|
|
53
|
+
super.register(server);
|
|
54
|
+
this.updateMetadata();
|
|
55
|
+
}
|
|
56
|
+
updateMetadata() {
|
|
57
|
+
if (this.config.connectionString || this.session.serviceProvider) {
|
|
58
|
+
this.update?.({
|
|
59
|
+
name: connectedName,
|
|
60
|
+
description: connectedDescription,
|
|
61
|
+
inputSchema: connectedSchema,
|
|
62
|
+
});
|
|
46
63
|
}
|
|
47
64
|
else {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
{
|
|
54
|
-
type: "text",
|
|
55
|
-
text: `Connecting via cluster name not supported yet. Please provide a connection string.`,
|
|
56
|
-
},
|
|
57
|
-
],
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
try {
|
|
61
|
-
await this.connectToMongoDB(connectionString);
|
|
62
|
-
return {
|
|
63
|
-
content: [{ type: "text", text: `Successfully connected to ${connectionString}.` }],
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
catch (error) {
|
|
67
|
-
// Sometimes the model will supply an incorrect connection string. If the user has configured
|
|
68
|
-
// a different one as environment variable or a cli argument, suggest using that one instead.
|
|
69
|
-
if (config.connectionString &&
|
|
70
|
-
error instanceof DriverError &&
|
|
71
|
-
config.connectionString !== connectionString) {
|
|
72
|
-
return {
|
|
73
|
-
content: [
|
|
74
|
-
{
|
|
75
|
-
type: "text",
|
|
76
|
-
text: `Failed to connect to MongoDB at '${connectionString}' due to error: '${error.message}.` +
|
|
77
|
-
`Your config lists a different connection string: '${config.connectionString}' - do you want to try connecting to it instead?`,
|
|
78
|
-
},
|
|
79
|
-
],
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
throw error;
|
|
65
|
+
this.update?.({
|
|
66
|
+
name: disconnectedName,
|
|
67
|
+
description: disconnectedDescription,
|
|
68
|
+
inputSchema: disconnectedSchema,
|
|
69
|
+
});
|
|
83
70
|
}
|
|
84
71
|
}
|
|
85
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../../src/tools/mongodb/metadata/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../../src/tools/mongodb/metadata/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,MAAM,MAAM,QAAQ,CAAC;AAK5B,MAAM,kBAAkB,GAAG,CAAC;KACvB,MAAM,CAAC;IACJ,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wEAAwE,CAAC;CAClH,CAAC;KACD,QAAQ,CAAC,oCAAoC,CAAC,CAAC;AAEpD,MAAM,eAAe,GAAG,CAAC;KACpB,MAAM,CAAC;IACJ,gBAAgB,EAAE,CAAC;SACd,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,qFAAqF,CAAC;CACvG,CAAC;KACD,QAAQ,CACL,mJAAmJ,CACtJ,CAAC;AAEN,MAAM,aAAa,GAAG,mBAA4B,CAAC;AACnD,MAAM,gBAAgB,GAAG,SAAkB,CAAC;AAE5C,MAAM,oBAAoB,GACtB,qRAAqR,CAAC;AAC1R,MAAM,uBAAuB,GAAG,+BAA+B,CAAC;AAEhE,MAAM,OAAO,WAAY,SAAQ,eAAe;IAY5C,YAAY,OAAgB,EAAE,MAAkB,EAAE,SAAoB;QAClE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAZ5B,SAAI,GAAmD,gBAAgB,CAAC;QACxE,gBAAW,GAAiE,uBAAuB,CAAC;QAE9G,0GAA0G;QAC1G,iCAAiC;QACvB,cAAS,GAAG;YAClB,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC1C,CAAC;QAEQ,kBAAa,GAAkB,UAAU,CAAC;QAIhD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;IACP,CAAC;IAES,KAAK,CAAC,OAAO,CAAC,EAAE,gBAAgB,EAAmC;QACzE,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAChB,KAAK,gBAAgB;gBACjB,MAAM,CAAC,gBAAgB,EAAE,+BAA+B,CAAC,CAAC;gBAC1D,MAAM;YACV,KAAK,aAAa;gBACd,gBAAgB,KAAhB,gBAAgB,GAAK,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAC;gBAClD,MAAM,CACF,gBAAgB,EAChB,6HAA6H,CAChI,CAAC;gBACF,MAAM;QACd,CAAC;QAED,MAAM,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QAC9C,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,OAAO;YACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oCAAoC,EAAE,CAAC;SAC1E,CAAC;IACN,CAAC;IAEM,QAAQ,CAAC,MAAiB;QAC7B,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEvB,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC;IAEO,cAAc;QAClB,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,IAAI,EAAE,aAAa;gBACnB,WAAW,EAAE,oBAAoB;gBACjC,WAAW,EAAE,eAAe;aAC/B,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,IAAI,EAAE,gBAAgB;gBACtB,WAAW,EAAE,uBAAuB;gBACpC,WAAW,EAAE,kBAAkB;aAClC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DbOperationArgs, MongoDBToolBase } from "../mongodbTool.js";
|
|
2
|
+
import { EJSON } from "bson";
|
|
2
3
|
export class DbStatsTool extends MongoDBToolBase {
|
|
3
4
|
constructor() {
|
|
4
5
|
super(...arguments);
|
|
@@ -18,7 +19,11 @@ export class DbStatsTool extends MongoDBToolBase {
|
|
|
18
19
|
return {
|
|
19
20
|
content: [
|
|
20
21
|
{
|
|
21
|
-
text: `Statistics for database ${database}
|
|
22
|
+
text: `Statistics for database ${database}`,
|
|
23
|
+
type: "text",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
text: EJSON.stringify(result),
|
|
22
27
|
type: "text",
|
|
23
28
|
},
|
|
24
29
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dbStats.js","sourceRoot":"","sources":["../../../../src/tools/mongodb/metadata/dbStats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"dbStats.js","sourceRoot":"","sources":["../../../../src/tools/mongodb/metadata/dbStats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAE7B,MAAM,OAAO,WAAY,SAAQ,eAAe;IAAhD;;QACc,SAAI,GAAG,UAAU,CAAC;QAClB,gBAAW,GAAG,oEAAoE,CAAC;QACnF,cAAS,GAAG;YAClB,QAAQ,EAAE,eAAe,CAAC,QAAQ;SACrC,CAAC;QAEQ,kBAAa,GAAkB,UAAU,CAAC;IAsBxD,CAAC;IApBa,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAmC;QACjE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,EAAE;YACxD,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,CAAC;SACX,CAAC,CAAC;QAEH,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,2BAA2B,QAAQ,EAAE;oBAC3C,IAAI,EAAE,MAAM;iBACf;gBACD;oBACI,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;oBAC7B,IAAI,EAAE,MAAM;iBACf;aACJ;SACJ,CAAC;IACN,CAAC;CACJ"}
|
|
@@ -34,13 +34,17 @@ export class ExplainTool extends MongoDBToolBase {
|
|
|
34
34
|
const provider = await this.ensureConnected();
|
|
35
35
|
const method = methods[0];
|
|
36
36
|
if (!method) {
|
|
37
|
-
throw new Error("No method provided");
|
|
37
|
+
throw new Error("No method provided. Expected one of the following: `aggregate`, `find`, or `count`");
|
|
38
38
|
}
|
|
39
39
|
let result;
|
|
40
40
|
switch (method.name) {
|
|
41
41
|
case "aggregate": {
|
|
42
42
|
const { pipeline } = method.arguments;
|
|
43
|
-
result = await provider
|
|
43
|
+
result = await provider
|
|
44
|
+
.aggregate(database, collection, pipeline, {}, {
|
|
45
|
+
writeConcern: undefined,
|
|
46
|
+
})
|
|
47
|
+
.explain(ExplainTool.defaultVerbosity);
|
|
44
48
|
break;
|
|
45
49
|
}
|
|
46
50
|
case "find": {
|
|
@@ -52,17 +56,20 @@ export class ExplainTool extends MongoDBToolBase {
|
|
|
52
56
|
}
|
|
53
57
|
case "count": {
|
|
54
58
|
const { query } = method.arguments;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
+
result = await provider.mongoClient.db(database).command({
|
|
60
|
+
explain: {
|
|
61
|
+
count: collection,
|
|
62
|
+
query,
|
|
63
|
+
},
|
|
64
|
+
verbosity: ExplainTool.defaultVerbosity,
|
|
65
|
+
});
|
|
59
66
|
break;
|
|
60
67
|
}
|
|
61
68
|
}
|
|
62
69
|
return {
|
|
63
70
|
content: [
|
|
64
71
|
{
|
|
65
|
-
text: `Here is some information about the winning plan chosen by the query optimizer for running the given \`${method.name}\` operation in
|
|
72
|
+
text: `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.`,
|
|
66
73
|
type: "text",
|
|
67
74
|
},
|
|
68
75
|
{
|
|
@@ -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,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAY,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,OAAO,WAAY,SAAQ,eAAe;IAAhD;;QACc,SAAI,GAAG,SAAS,CAAC;QACjB,gBAAW,GACjB,wHAAwH,CAAC;QAEnH,cAAS,GAAG;YAClB,GAAG,eAAe;YAClB,MAAM,EAAE,CAAC;iBACJ,KAAK,CACF,CAAC,CAAC,KAAK,CAAC;gBACJ,CAAC,CAAC,MAAM,CAAC;oBACL,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;oBAC5B,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;iBACrC,CAAC;gBACF,CAAC,CAAC,MAAM,CAAC;oBACL,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;oBACvB,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;iBAChC,CAAC;gBACF,CAAC,CAAC,MAAM,CAAC;oBACL,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;oBACxB,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;iBACjC,CAAC;aACL,CAAC,CACL;iBACA,QAAQ,CAAC,qCAAqC,CAAC;SACvD,CAAC;QAEQ,kBAAa,GAAkB,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"explain.js","sourceRoot":"","sources":["../../../../src/tools/mongodb/metadata/explain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { MongoDBToolBase } from "../mongodbTool.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export class LogsTool extends MongoDBToolBase {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(...arguments);
|
|
6
|
+
this.name = "mongodb-logs";
|
|
7
|
+
this.description = "Returns the most recent logged mongod events";
|
|
8
|
+
this.argsShape = {
|
|
9
|
+
type: z
|
|
10
|
+
.enum(["global", "startupWarnings"])
|
|
11
|
+
.optional()
|
|
12
|
+
.default("global")
|
|
13
|
+
.describe("The type of logs to return. Global returns all recent log entries, while startupWarnings returns only warnings and errors from when the process started."),
|
|
14
|
+
limit: z
|
|
15
|
+
.number()
|
|
16
|
+
.int()
|
|
17
|
+
.max(1024)
|
|
18
|
+
.min(1)
|
|
19
|
+
.optional()
|
|
20
|
+
.default(50)
|
|
21
|
+
.describe("The maximum number of log entries to return."),
|
|
22
|
+
};
|
|
23
|
+
this.operationType = "metadata";
|
|
24
|
+
}
|
|
25
|
+
async execute({ type, limit }) {
|
|
26
|
+
const provider = await this.ensureConnected();
|
|
27
|
+
const result = await provider.runCommandWithCheck("admin", {
|
|
28
|
+
getLog: type,
|
|
29
|
+
});
|
|
30
|
+
const logs = result.log.slice(0, limit);
|
|
31
|
+
return {
|
|
32
|
+
content: [
|
|
33
|
+
{
|
|
34
|
+
text: `Found: ${result.totalLinesWritten} messages`,
|
|
35
|
+
type: "text",
|
|
36
|
+
},
|
|
37
|
+
...logs.map((log) => ({
|
|
38
|
+
text: log,
|
|
39
|
+
type: "text",
|
|
40
|
+
})),
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../../src/tools/mongodb/metadata/logs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,OAAO,QAAS,SAAQ,eAAe;IAA7C;;QACc,SAAI,GAAG,cAAc,CAAC;QACtB,gBAAW,GAAG,8CAA8C,CAAC;QAC7D,cAAS,GAAG;YAClB,IAAI,EAAE,CAAC;iBACF,IAAI,CAAC,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;iBACnC,QAAQ,EAAE;iBACV,OAAO,CAAC,QAAQ,CAAC;iBACjB,QAAQ,CACL,0JAA0J,CAC7J;YACL,KAAK,EAAE,CAAC;iBACH,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,IAAI,CAAC;iBACT,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,EAAE;iBACV,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,8CAA8C,CAAC;SAChE,CAAC;QAEQ,kBAAa,GAAkB,UAAU,CAAC;IA4BxD,CAAC;IA1Ba,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAmC;QACpE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAE9C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE;YACvD,MAAM,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,MAAM,IAAI,GAAI,MAAM,CAAC,GAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAEtD,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,UAAU,MAAM,CAAC,iBAAiB,WAAW;oBACnD,IAAI,EAAE,MAAM;iBACf;gBAED,GAAG,IAAI,CAAC,GAAG,CACP,CAAC,GAAG,EAAE,EAAE,CACJ,CAAC;oBACG,IAAI,EAAE,GAAG;oBACT,IAAI,EAAE,MAAM;iBACf,CAAU,CAClB;aACJ;SACJ,CAAC;IACN,CAAC;CACJ"}
|
|
@@ -1,58 +1,64 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { ToolBase } from "../tool.js";
|
|
3
|
-
import { NodeDriverServiceProvider } from "@mongosh/service-provider-node-driver";
|
|
4
3
|
import { ErrorCodes, MongoDBError } from "../../errors.js";
|
|
5
|
-
import
|
|
4
|
+
import logger, { LogId } from "../../logger.js";
|
|
6
5
|
export const DbOperationArgs = {
|
|
7
6
|
database: z.string().describe("Database name"),
|
|
8
7
|
collection: z.string().describe("Collection name"),
|
|
9
8
|
};
|
|
10
9
|
export class MongoDBToolBase extends ToolBase {
|
|
11
|
-
constructor(
|
|
12
|
-
super(
|
|
10
|
+
constructor() {
|
|
11
|
+
super(...arguments);
|
|
13
12
|
this.category = "mongodb";
|
|
14
13
|
}
|
|
15
14
|
async ensureConnected() {
|
|
16
|
-
if (!this.session.serviceProvider && config.connectionString) {
|
|
17
|
-
|
|
15
|
+
if (!this.session.serviceProvider && this.config.connectionString) {
|
|
16
|
+
try {
|
|
17
|
+
await this.connectToMongoDB(this.config.connectionString);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
logger.error(LogId.mongodbConnectFailure, "mongodbTool", `Failed to connect to MongoDB instance using the connection string from the config: ${error}`);
|
|
21
|
+
throw new MongoDBError(ErrorCodes.MisconfiguredConnectionString, "Not connected to MongoDB.");
|
|
22
|
+
}
|
|
18
23
|
}
|
|
19
24
|
if (!this.session.serviceProvider) {
|
|
20
25
|
throw new MongoDBError(ErrorCodes.NotConnectedToMongoDB, "Not connected to MongoDB");
|
|
21
26
|
}
|
|
22
27
|
return this.session.serviceProvider;
|
|
23
28
|
}
|
|
24
|
-
handleError(error) {
|
|
25
|
-
if (error instanceof MongoDBError
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
{
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
29
|
+
handleError(error, args) {
|
|
30
|
+
if (error instanceof MongoDBError) {
|
|
31
|
+
switch (error.code) {
|
|
32
|
+
case ErrorCodes.NotConnectedToMongoDB:
|
|
33
|
+
return {
|
|
34
|
+
content: [
|
|
35
|
+
{
|
|
36
|
+
type: "text",
|
|
37
|
+
text: "You need to connect to a MongoDB instance before you can access its data.",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
type: "text",
|
|
41
|
+
text: "Please use the 'connect' or 'switch-connection' tool to connect to a MongoDB instance.",
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
isError: true,
|
|
45
|
+
};
|
|
46
|
+
case ErrorCodes.MisconfiguredConnectionString:
|
|
47
|
+
return {
|
|
48
|
+
content: [
|
|
49
|
+
{
|
|
50
|
+
type: "text",
|
|
51
|
+
text: "The configured connection string is not valid. Please check the connection string and confirm it points to a valid MongoDB instance. Alternatively, use the 'switch-connection' tool to connect to a different instance.",
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
isError: true,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
39
57
|
}
|
|
40
|
-
return super.handleError(error);
|
|
58
|
+
return super.handleError(error, args);
|
|
41
59
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
productDocsLink: "https://docs.mongodb.com/todo-mcp",
|
|
45
|
-
productName: "MongoDB MCP",
|
|
46
|
-
readConcern: {
|
|
47
|
-
level: config.connectOptions.readConcern,
|
|
48
|
-
},
|
|
49
|
-
readPreference: config.connectOptions.readPreference,
|
|
50
|
-
writeConcern: {
|
|
51
|
-
w: config.connectOptions.writeConcern,
|
|
52
|
-
},
|
|
53
|
-
timeoutMS: config.connectOptions.timeoutMS,
|
|
54
|
-
});
|
|
55
|
-
this.session.serviceProvider = provider;
|
|
60
|
+
connectToMongoDB(connectionString) {
|
|
61
|
+
return this.session.connectToMongoDB(connectionString, this.config.connectOptions);
|
|
56
62
|
}
|
|
57
63
|
}
|
|
58
64
|
//# sourceMappingURL=mongodbTool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongodbTool.js","sourceRoot":"","sources":["../../../src/tools/mongodb/mongodbTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"mongodbTool.js","sourceRoot":"","sources":["../../../src/tools/mongodb/mongodbTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAY,QAAQ,EAAgB,MAAM,YAAY,CAAC;AAG9D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;IAC9C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CACrD,CAAC;AAEF,MAAM,OAAgB,eAAgB,SAAQ,QAAQ;IAAtD;;QACc,aAAQ,GAAiB,SAAS,CAAC;IA8DjD,CAAC;IA5Da,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAChE,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAC9D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CACR,KAAK,CAAC,qBAAqB,EAC3B,aAAa,EACb,sFAAsF,KAAe,EAAE,CAC1G,CAAC;gBACF,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC,6BAA6B,EAAE,2BAA2B,CAAC,CAAC;YAClG,CAAC;QACL,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAChC,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC,qBAAqB,EAAE,0BAA0B,CAAC,CAAC;QACzF,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;IACxC,CAAC;IAES,WAAW,CACjB,KAAc,EACd,IAAqC;QAErC,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;YAChC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjB,KAAK,UAAU,CAAC,qBAAqB;oBACjC,OAAO;wBACH,OAAO,EAAE;4BACL;gCACI,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,2EAA2E;6BACpF;4BACD;gCACI,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,wFAAwF;6BACjG;yBACJ;wBACD,OAAO,EAAE,IAAI;qBAChB,CAAC;gBACN,KAAK,UAAU,CAAC,6BAA6B;oBACzC,OAAO;wBACH,OAAO,EAAE;4BACL;gCACI,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,0NAA0N;6BACnO;yBACJ;wBACD,OAAO,EAAE,IAAI;qBAChB,CAAC;YACV,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAES,gBAAgB,CAAC,gBAAwB;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACvF,CAAC;CACJ"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { DbOperationArgs, MongoDBToolBase } from "../mongodbTool.js";
|
|
3
|
+
import { EJSON } from "bson";
|
|
3
4
|
export const AggregateArgs = {
|
|
4
|
-
pipeline: z.array(z.
|
|
5
|
-
limit: z.number().optional().default(10).describe("The maximum number of documents to return"),
|
|
5
|
+
pipeline: z.array(z.record(z.string(), z.unknown())).describe("An array of aggregation stages to execute"),
|
|
6
6
|
};
|
|
7
7
|
export class AggregateTool extends MongoDBToolBase {
|
|
8
8
|
constructor() {
|
|
@@ -20,12 +20,12 @@ export class AggregateTool extends MongoDBToolBase {
|
|
|
20
20
|
const documents = await provider.aggregate(database, collection, pipeline).toArray();
|
|
21
21
|
const content = [
|
|
22
22
|
{
|
|
23
|
-
text: `Found ${documents.length} documents in the collection
|
|
23
|
+
text: `Found ${documents.length} documents in the collection "${collection}":`,
|
|
24
24
|
type: "text",
|
|
25
25
|
},
|
|
26
26
|
...documents.map((doc) => {
|
|
27
27
|
return {
|
|
28
|
-
text:
|
|
28
|
+
text: EJSON.stringify(doc),
|
|
29
29
|
type: "text",
|
|
30
30
|
};
|
|
31
31
|
}),
|
|
@@ -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;
|
|
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,KAAK,EAAE,MAAM,MAAM,CAAC;AAE7B,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC;CAC7G,CAAC;AAEF,MAAM,OAAO,aAAc,SAAQ,eAAe;IAAlD;;QACc,SAAI,GAAG,WAAW,CAAC;QACnB,gBAAW,GAAG,iDAAiD,CAAC;QAChE,cAAS,GAAG;YAClB,GAAG,eAAe;YAClB,GAAG,aAAa;SACnB,CAAC;QACQ,kBAAa,GAAkB,MAAM,CAAC;IA2BpD,CAAC;IAzBa,KAAK,CAAC,OAAO,CAAC,EACpB,QAAQ,EACR,UAAU,EACV,QAAQ,GACsB;QAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;QAErF,MAAM,OAAO,GAA0C;YACnD;gBACI,IAAI,EAAE,SAAS,SAAS,CAAC,MAAM,iCAAiC,UAAU,IAAI;gBAC9E,IAAI,EAAE,MAAM;aACf;YACD,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrB,OAAO;oBACH,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;oBAC1B,IAAI,EAAE,MAAM;iBACmB,CAAC;YACxC,CAAC,CAAC;SACL,CAAC;QAEF,OAAO;YACH,OAAO;SACV,CAAC;IACN,CAAC;CACJ"}
|
|
@@ -11,13 +11,32 @@ export class CollectionIndexesTool extends MongoDBToolBase {
|
|
|
11
11
|
const provider = await this.ensureConnected();
|
|
12
12
|
const indexes = await provider.getIndexes(database, collection);
|
|
13
13
|
return {
|
|
14
|
-
content:
|
|
15
|
-
|
|
16
|
-
text: `
|
|
14
|
+
content: [
|
|
15
|
+
{
|
|
16
|
+
text: `Found ${indexes.length} indexes in the collection "${collection}":`,
|
|
17
17
|
type: "text",
|
|
18
|
-
}
|
|
19
|
-
|
|
18
|
+
},
|
|
19
|
+
...indexes.map((indexDefinition) => {
|
|
20
|
+
return {
|
|
21
|
+
text: `Name "${indexDefinition.name}", definition: ${JSON.stringify(indexDefinition.key)}`,
|
|
22
|
+
type: "text",
|
|
23
|
+
};
|
|
24
|
+
}),
|
|
25
|
+
],
|
|
20
26
|
};
|
|
21
27
|
}
|
|
28
|
+
handleError(error, args) {
|
|
29
|
+
if (error instanceof Error && "codeName" in error && error.codeName === "NamespaceNotFound") {
|
|
30
|
+
return {
|
|
31
|
+
content: [
|
|
32
|
+
{
|
|
33
|
+
text: `The indexes for "${args.database}.${args.collection}" cannot be determined because the collection does not exist.`,
|
|
34
|
+
type: "text",
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return super.handleError(error, args);
|
|
40
|
+
}
|
|
22
41
|
}
|
|
23
42
|
//# sourceMappingURL=collectionIndexes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collectionIndexes.js","sourceRoot":"","sources":["../../../../src/tools/mongodb/read/collectionIndexes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGrE,MAAM,OAAO,qBAAsB,SAAQ,eAAe;IAA1D;;QACc,SAAI,GAAG,oBAAoB,CAAC;QAC5B,gBAAW,GAAG,uCAAuC,CAAC;QACtD,cAAS,GAAG,eAAe,CAAC;QAC5B,kBAAa,GAAkB,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"collectionIndexes.js","sourceRoot":"","sources":["../../../../src/tools/mongodb/read/collectionIndexes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGrE,MAAM,OAAO,qBAAsB,SAAQ,eAAe;IAA1D;;QACc,SAAI,GAAG,oBAAoB,CAAC;QAC5B,gBAAW,GAAG,uCAAuC,CAAC;QACtD,cAAS,GAAG,eAAe,CAAC;QAC5B,kBAAa,GAAkB,MAAM,CAAC;IAuCpD,CAAC;IArCa,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAoC;QAC9E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEhE,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,SAAS,OAAO,CAAC,MAAM,+BAA+B,UAAU,IAAI;oBAC1E,IAAI,EAAE,MAAM;iBACf;gBACD,GAAI,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,EAAE;oBAChC,OAAO;wBACH,IAAI,EAAE,SAAS,eAAe,CAAC,IAAI,kBAAkB,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE;wBAC1F,IAAI,EAAE,MAAM;qBACf,CAAC;gBACN,CAAC,CAAsC;aAC1C;SACJ,CAAC;IACN,CAAC;IAES,WAAW,CACjB,KAAc,EACd,IAAqC;QAErC,IAAI,KAAK,YAAY,KAAK,IAAI,UAAU,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,mBAAmB,EAAE,CAAC;YAC1F,OAAO;gBACH,OAAO,EAAE;oBACL;wBACI,IAAI,EAAE,oBAAoB,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,+DAA+D;wBACzH,IAAI,EAAE,MAAM;qBACf;iBACJ;aACJ,CAAC;QACN,CAAC;QAED,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;CACJ"}
|
|
@@ -2,8 +2,7 @@ import { DbOperationArgs, MongoDBToolBase } from "../mongodbTool.js";
|
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
export const CountArgs = {
|
|
4
4
|
query: z
|
|
5
|
-
.
|
|
6
|
-
.passthrough()
|
|
5
|
+
.record(z.string(), z.unknown())
|
|
7
6
|
.optional()
|
|
8
7
|
.describe("The query filter to count documents. Matches the syntax of the filter argument of db.collection.count()"),
|
|
9
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;AAExB,MAAM,CAAC,MAAM,SAAS,GAAG;IACrB,KAAK,EAAE,CAAC;SACH,MAAM,CAAC,EAAE,CAAC
|
|
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;AAExB,MAAM,CAAC,MAAM,SAAS,GAAG;IACrB,KAAK,EAAE,CAAC;SACH,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/B,QAAQ,EAAE;SACV,QAAQ,CACL,yGAAyG,CAC5G;CACR,CAAC;AAEF,MAAM,OAAO,SAAU,SAAQ,eAAe;IAA9C;;QACc,SAAI,GAAG,OAAO,CAAC;QACf,gBAAW,GAAG,sDAAsD,CAAC;QACrE,cAAS,GAAG;YAClB,GAAG,eAAe;YAClB,GAAG,SAAS;SACf,CAAC;QAEQ,kBAAa,GAAkB,MAAM,CAAC;IAepD,CAAC;IAba,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAmC;QACpF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9C,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,14 +1,13 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { DbOperationArgs, MongoDBToolBase } from "../mongodbTool.js";
|
|
3
|
+
import { EJSON } from "bson";
|
|
3
4
|
export const FindArgs = {
|
|
4
5
|
filter: z
|
|
5
|
-
.
|
|
6
|
-
.passthrough()
|
|
6
|
+
.record(z.string(), z.unknown())
|
|
7
7
|
.optional()
|
|
8
8
|
.describe("The query filter, matching the syntax of the query argument of db.collection.find()"),
|
|
9
9
|
projection: z
|
|
10
|
-
.
|
|
11
|
-
.passthrough()
|
|
10
|
+
.record(z.string(), z.unknown())
|
|
12
11
|
.optional()
|
|
13
12
|
.describe("The projection, matching the syntax of the projection argument of db.collection.find()"),
|
|
14
13
|
limit: z.number().optional().default(10).describe("The maximum number of documents to return"),
|
|
@@ -33,12 +32,12 @@ export class FindTool extends MongoDBToolBase {
|
|
|
33
32
|
const documents = await provider.find(database, collection, filter, { projection, limit, sort }).toArray();
|
|
34
33
|
const content = [
|
|
35
34
|
{
|
|
36
|
-
text: `Found ${documents.length} documents in the collection
|
|
35
|
+
text: `Found ${documents.length} documents in the collection "${collection}":`,
|
|
37
36
|
type: "text",
|
|
38
37
|
},
|
|
39
38
|
...documents.map((doc) => {
|
|
40
39
|
return {
|
|
41
|
-
text:
|
|
40
|
+
text: EJSON.stringify(doc),
|
|
42
41
|
type: "text",
|
|
43
42
|
};
|
|
44
43
|
}),
|
|
@@ -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;
|
|
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;AAGrE,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAE7B,MAAM,CAAC,MAAM,QAAQ,GAAG;IACpB,MAAM,EAAE,CAAC;SACJ,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/B,QAAQ,EAAE;SACV,QAAQ,CAAC,qFAAqF,CAAC;IACpG,UAAU,EAAE,CAAC;SACR,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/B,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,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAiB,CAAC;SAC7C,QAAQ,EAAE;SACV,QAAQ,CAAC,kGAAkG,CAAC;CACpH,CAAC;AAEF,MAAM,OAAO,QAAS,SAAQ,eAAe;IAA7C;;QACc,SAAI,GAAG,MAAM,CAAC;QACd,gBAAW,GAAG,+CAA+C,CAAC;QAC9D,cAAS,GAAG;YAClB,GAAG,eAAe;YAClB,GAAG,QAAQ;SACd,CAAC;QACQ,kBAAa,GAAkB,MAAM,CAAC;IA8BpD,CAAC;IA5Ba,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;QAC9C,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,MAAM,OAAO,GAA0C;YACnD;gBACI,IAAI,EAAE,SAAS,SAAS,CAAC,MAAM,iCAAiC,UAAU,IAAI;gBAC9E,IAAI,EAAE,MAAM;aACf;YACD,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrB,OAAO;oBACH,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;oBAC1B,IAAI,EAAE,MAAM;iBACmB,CAAC;YACxC,CAAC,CAAC;SACL,CAAC;QAEF,OAAO;YACH,OAAO;SACV,CAAC;IACN,CAAC;CACJ"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
// TODO: https://github.com/mongodb-js/mongodb-mcp-server/issues/141 - reenable when the connect tool is reenabled
|
|
2
|
+
// import { ConnectTool } from "./metadata/connect.js";
|
|
2
3
|
import { ListCollectionsTool } from "./metadata/listCollections.js";
|
|
3
4
|
import { CollectionIndexesTool } from "./read/collectionIndexes.js";
|
|
4
5
|
import { ListDatabasesTool } from "./metadata/listDatabases.js";
|
|
@@ -17,8 +18,10 @@ import { DropDatabaseTool } from "./delete/dropDatabase.js";
|
|
|
17
18
|
import { DropCollectionTool } from "./delete/dropCollection.js";
|
|
18
19
|
import { ExplainTool } from "./metadata/explain.js";
|
|
19
20
|
import { CreateCollectionTool } from "./create/createCollection.js";
|
|
21
|
+
import { LogsTool } from "./metadata/logs.js";
|
|
20
22
|
export const MongoDbTools = [
|
|
21
|
-
|
|
23
|
+
// TODO: https://github.com/mongodb-js/mongodb-mcp-server/issues/141 - reenable when the connect tool is reenabled
|
|
24
|
+
// ConnectTool,
|
|
22
25
|
ListCollectionsTool,
|
|
23
26
|
ListDatabasesTool,
|
|
24
27
|
CollectionIndexesTool,
|
|
@@ -37,5 +40,6 @@ export const MongoDbTools = [
|
|
|
37
40
|
DropCollectionTool,
|
|
38
41
|
ExplainTool,
|
|
39
42
|
CreateCollectionTool,
|
|
43
|
+
LogsTool,
|
|
40
44
|
];
|
|
41
45
|
//# sourceMappingURL=tools.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/tools/mongodb/tools.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/tools/mongodb/tools.ts"],"names":[],"mappings":"AAAA,kHAAkH;AAClH,uDAAuD;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,MAAM,YAAY,GAAG;IACxB,kHAAkH;IAClH,eAAe;IACf,mBAAmB;IACnB,iBAAiB;IACjB,qBAAqB;IACrB,eAAe;IACf,oBAAoB;IACpB,QAAQ;IACR,cAAc;IACd,cAAc;IACd,yBAAyB;IACzB,SAAS;IACT,WAAW;IACX,aAAa;IACb,cAAc;IACd,oBAAoB;IACpB,gBAAgB;IAChB,kBAAkB;IAClB,WAAW;IACX,oBAAoB;IACpB,QAAQ;CACX,CAAC"}
|