mongodb-mcp-server 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/accuracy-tests.yml +55 -0
- package/.github/workflows/check.yml +1 -1
- package/.github/workflows/code_health.yaml +1 -1
- package/.github/workflows/code_health_fork.yaml +0 -14
- package/.github/workflows/dependabot_pr.yaml +26 -0
- package/.github/workflows/jira-issue.yml +72 -0
- package/.vscode/extensions.json +1 -1
- package/.vscode/launch.json +11 -1
- package/.vscode/settings.json +1 -11
- package/Dockerfile +1 -0
- package/README.md +118 -31
- package/dist/common/atlas/accessListUtils.js +36 -0
- package/dist/common/atlas/accessListUtils.js.map +1 -0
- package/dist/common/atlas/apiClient.js +25 -6
- package/dist/common/atlas/apiClient.js.map +1 -1
- package/dist/common/atlas/cluster.js +1 -1
- package/dist/common/atlas/cluster.js.map +1 -1
- package/dist/{config.js → common/config.js} +7 -1
- package/dist/common/config.js.map +1 -0
- package/dist/common/errors.js.map +1 -0
- package/dist/{logger.js → common/logger.js} +20 -18
- package/dist/common/logger.js.map +1 -0
- package/dist/common/managedTimeout.js +20 -0
- package/dist/common/managedTimeout.js.map +1 -0
- package/dist/common/packageInfo.js.map +1 -0
- package/dist/{session.js → common/session.js} +20 -21
- package/dist/common/session.js.map +1 -0
- package/dist/common/sessionStore.js +73 -0
- package/dist/common/sessionStore.js.map +1 -0
- package/dist/helpers/container.js +28 -0
- package/dist/helpers/container.js.map +1 -0
- package/dist/helpers/generatePassword.js.map +1 -0
- package/dist/helpers/indexCheck.js +1 -1
- package/dist/helpers/indexCheck.js.map +1 -1
- package/dist/index.js +30 -37
- package/dist/index.js.map +1 -1
- package/dist/server.js +43 -6
- package/dist/server.js.map +1 -1
- package/dist/telemetry/constants.js +1 -1
- package/dist/telemetry/constants.js.map +1 -1
- package/dist/telemetry/telemetry.js +28 -21
- package/dist/telemetry/telemetry.js.map +1 -1
- package/dist/tools/atlas/atlasTool.js +3 -3
- package/dist/tools/atlas/atlasTool.js.map +1 -1
- package/dist/tools/atlas/connect/connectCluster.js +198 -0
- package/dist/tools/atlas/connect/connectCluster.js.map +1 -0
- package/dist/tools/atlas/create/createAccessList.js +9 -10
- package/dist/tools/atlas/create/createAccessList.js.map +1 -1
- package/dist/tools/atlas/create/createDBUser.js +3 -1
- package/dist/tools/atlas/create/createDBUser.js.map +1 -1
- package/dist/tools/atlas/create/createFreeCluster.js +2 -0
- package/dist/tools/atlas/create/createFreeCluster.js.map +1 -1
- package/dist/tools/atlas/create/createProject.js.map +1 -1
- package/dist/tools/atlas/read/inspectAccessList.js.map +1 -1
- package/dist/tools/atlas/read/inspectCluster.js.map +1 -1
- package/dist/tools/atlas/read/listAlerts.js.map +1 -1
- package/dist/tools/atlas/read/listClusters.js.map +1 -1
- package/dist/tools/atlas/read/listDBUsers.js.map +1 -1
- package/dist/tools/atlas/read/listOrgs.js.map +1 -1
- package/dist/tools/atlas/read/listProjects.js.map +1 -1
- package/dist/tools/atlas/tools.js +1 -1
- package/dist/tools/atlas/tools.js.map +1 -1
- package/dist/tools/mongodb/{metadata → connect}/connect.js +7 -4
- package/dist/tools/mongodb/connect/connect.js.map +1 -0
- package/dist/tools/mongodb/create/createCollection.js.map +1 -1
- package/dist/tools/mongodb/create/createIndex.js +1 -1
- package/dist/tools/mongodb/create/createIndex.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 +2 -1
- package/dist/tools/mongodb/delete/deleteMany.js.map +1 -1
- package/dist/tools/mongodb/delete/dropCollection.js.map +1 -1
- package/dist/tools/mongodb/delete/dropDatabase.js.map +1 -1
- package/dist/tools/mongodb/metadata/collectionSchema.js.map +1 -1
- package/dist/tools/mongodb/metadata/collectionStorageSize.js.map +1 -1
- package/dist/tools/mongodb/metadata/dbStats.js.map +1 -1
- package/dist/tools/mongodb/metadata/explain.js +1 -1
- package/dist/tools/mongodb/metadata/explain.js.map +1 -1
- package/dist/tools/mongodb/metadata/listCollections.js.map +1 -1
- package/dist/tools/mongodb/metadata/listDatabases.js.map +1 -1
- package/dist/tools/mongodb/metadata/logs.js.map +1 -1
- package/dist/tools/mongodb/mongodbTool.js +37 -10
- package/dist/tools/mongodb/mongodbTool.js.map +1 -1
- package/dist/tools/mongodb/read/aggregate.js +1 -1
- package/dist/tools/mongodb/read/aggregate.js.map +1 -1
- package/dist/tools/mongodb/read/collectionIndexes.js.map +1 -1
- package/dist/tools/mongodb/read/count.js +2 -1
- package/dist/tools/mongodb/read/count.js.map +1 -1
- package/dist/tools/mongodb/read/find.js +7 -4
- package/dist/tools/mongodb/read/find.js.map +1 -1
- package/dist/tools/mongodb/tools.js +1 -1
- package/dist/tools/mongodb/tools.js.map +1 -1
- package/dist/tools/mongodb/update/renameCollection.js.map +1 -1
- package/dist/tools/mongodb/update/updateMany.js +4 -2
- package/dist/tools/mongodb/update/updateMany.js.map +1 -1
- package/dist/tools/tool.js +8 -5
- package/dist/tools/tool.js.map +1 -1
- package/dist/transports/base.js +26 -0
- package/dist/transports/base.js.map +1 -0
- package/dist/{helpers/EJsonTransport.js → transports/stdio.js} +24 -2
- package/dist/transports/stdio.js.map +1 -0
- package/dist/transports/streamableHttp.js +140 -0
- package/dist/transports/streamableHttp.js.map +1 -0
- package/eslint.config.js +13 -4
- package/package.json +43 -33
- package/resources/test-summary-template.html +415 -0
- package/scripts/accuracy/generateTestSummary.ts +335 -0
- package/scripts/accuracy/runAccuracyTests.sh +45 -0
- package/scripts/accuracy/updateAccuracyRunStatus.ts +21 -0
- package/src/common/atlas/accessListUtils.ts +54 -0
- package/src/common/atlas/apiClient.ts +25 -6
- package/src/common/atlas/cluster.ts +1 -1
- package/src/{config.ts → common/config.ts} +14 -2
- package/src/{logger.ts → common/logger.ts} +21 -23
- package/src/common/managedTimeout.ts +27 -0
- package/src/{session.ts → common/session.ts} +24 -26
- package/src/common/sessionStore.ts +111 -0
- package/src/helpers/container.ts +35 -0
- package/src/helpers/indexCheck.ts +1 -1
- package/src/index.ts +30 -40
- package/src/server.ts +54 -10
- package/src/telemetry/constants.ts +1 -1
- package/src/telemetry/telemetry.ts +34 -26
- package/src/telemetry/types.ts +2 -0
- package/src/tools/atlas/atlasTool.ts +4 -4
- package/src/tools/atlas/connect/connectCluster.ts +259 -0
- package/src/tools/atlas/create/createAccessList.ts +15 -13
- package/src/tools/atlas/create/createDBUser.ts +5 -3
- package/src/tools/atlas/create/createFreeCluster.ts +4 -2
- package/src/tools/atlas/create/createProject.ts +2 -2
- package/src/tools/atlas/read/inspectAccessList.ts +2 -2
- package/src/tools/atlas/read/inspectCluster.ts +2 -2
- package/src/tools/atlas/read/listAlerts.ts +2 -2
- package/src/tools/atlas/read/listClusters.ts +2 -2
- package/src/tools/atlas/read/listDBUsers.ts +2 -2
- package/src/tools/atlas/read/listOrgs.ts +2 -2
- package/src/tools/atlas/read/listProjects.ts +2 -2
- package/src/tools/atlas/tools.ts +1 -1
- package/src/tools/mongodb/{metadata → connect}/connect.ts +12 -9
- package/src/tools/mongodb/create/createCollection.ts +2 -2
- package/src/tools/mongodb/create/createIndex.ts +3 -3
- package/src/tools/mongodb/create/insertMany.ts +3 -3
- package/src/tools/mongodb/delete/deleteMany.ts +4 -3
- package/src/tools/mongodb/delete/dropCollection.ts +2 -2
- package/src/tools/mongodb/delete/dropDatabase.ts +2 -2
- package/src/tools/mongodb/metadata/collectionSchema.ts +2 -2
- package/src/tools/mongodb/metadata/collectionStorageSize.ts +2 -2
- package/src/tools/mongodb/metadata/dbStats.ts +2 -2
- package/src/tools/mongodb/metadata/explain.ts +3 -3
- package/src/tools/mongodb/metadata/listCollections.ts +2 -2
- package/src/tools/mongodb/metadata/listDatabases.ts +2 -2
- package/src/tools/mongodb/metadata/logs.ts +2 -2
- package/src/tools/mongodb/mongodbTool.ts +50 -14
- package/src/tools/mongodb/read/aggregate.ts +3 -3
- package/src/tools/mongodb/read/collectionIndexes.ts +2 -2
- package/src/tools/mongodb/read/count.ts +4 -3
- package/src/tools/mongodb/read/find.ts +11 -6
- package/src/tools/mongodb/tools.ts +1 -1
- package/src/tools/mongodb/update/renameCollection.ts +2 -2
- package/src/tools/mongodb/update/updateMany.ts +6 -4
- package/src/tools/tool.ts +18 -13
- package/src/transports/base.ts +34 -0
- package/src/{helpers/EJsonTransport.ts → transports/stdio.ts} +30 -1
- package/src/transports/streamableHttp.ts +178 -0
- package/tests/accuracy/aggregate.test.ts +27 -0
- package/tests/accuracy/collectionIndexes.test.ts +40 -0
- package/tests/accuracy/collectionSchema.test.ts +28 -0
- package/tests/accuracy/collectionStorageSize.test.ts +41 -0
- package/tests/accuracy/count.test.ts +44 -0
- package/tests/accuracy/createCollection.test.ts +46 -0
- package/tests/accuracy/createIndex.test.ts +37 -0
- package/tests/accuracy/dbStats.test.ts +15 -0
- package/tests/accuracy/deleteMany.test.ts +44 -0
- package/tests/accuracy/dropCollection.test.ts +74 -0
- package/tests/accuracy/dropDatabase.test.ts +41 -0
- package/tests/accuracy/explain.test.ts +73 -0
- package/tests/accuracy/find.test.ts +114 -0
- package/tests/accuracy/insertMany.test.ts +48 -0
- package/tests/accuracy/listCollections.test.ts +60 -0
- package/tests/accuracy/listDatabases.test.ts +31 -0
- package/tests/accuracy/logs.test.ts +28 -0
- package/tests/accuracy/renameCollection.test.ts +31 -0
- package/tests/accuracy/sdk/accuracyResultStorage/diskStorage.ts +189 -0
- package/tests/accuracy/sdk/accuracyResultStorage/getAccuracyResultStorage.ts +11 -0
- package/tests/accuracy/sdk/accuracyResultStorage/mongodbStorage.ts +151 -0
- package/tests/accuracy/sdk/accuracyResultStorage/resultStorage.ts +117 -0
- package/tests/accuracy/sdk/accuracyScorer.ts +93 -0
- package/tests/accuracy/sdk/accuracyTestingClient.ts +94 -0
- package/tests/accuracy/sdk/agent.ts +56 -0
- package/tests/accuracy/sdk/constants.ts +26 -0
- package/tests/accuracy/sdk/describeAccuracyTests.ts +126 -0
- package/tests/accuracy/sdk/gitInfo.ts +7 -0
- package/tests/accuracy/sdk/matcher.ts +193 -0
- package/tests/accuracy/sdk/models.ts +95 -0
- package/tests/accuracy/test-data-dumps/comics.books.json +417 -0
- package/tests/accuracy/test-data-dumps/comics.characters.json +402 -0
- package/tests/accuracy/test-data-dumps/mflix.movies.json +496 -0
- package/tests/accuracy/test-data-dumps/mflix.shows.json +572 -0
- package/tests/accuracy/updateMany.test.ts +42 -0
- package/tests/integration/helpers.ts +9 -9
- package/tests/integration/indexCheck.test.ts +1 -0
- package/tests/integration/server.test.ts +1 -0
- package/tests/integration/telemetry.test.ts +4 -3
- package/tests/integration/tools/atlas/accessLists.test.ts +22 -2
- package/tests/integration/tools/atlas/alerts.test.ts +3 -2
- package/tests/integration/tools/atlas/atlasHelpers.ts +3 -0
- package/tests/integration/tools/atlas/clusters.test.ts +68 -16
- package/tests/integration/tools/atlas/dbUsers.test.ts +14 -1
- package/tests/integration/tools/atlas/orgs.test.ts +2 -1
- package/tests/integration/tools/atlas/projects.test.ts +4 -3
- package/tests/integration/tools/mongodb/{metadata → connect}/connect.test.ts +34 -3
- package/tests/integration/tools/mongodb/create/createCollection.test.ts +1 -0
- package/tests/integration/tools/mongodb/create/createIndex.test.ts +1 -0
- package/tests/integration/tools/mongodb/create/insertMany.test.ts +1 -0
- package/tests/integration/tools/mongodb/delete/deleteMany.test.ts +1 -0
- package/tests/integration/tools/mongodb/delete/dropCollection.test.ts +1 -1
- package/tests/integration/tools/mongodb/delete/dropDatabase.test.ts +1 -0
- package/tests/integration/tools/mongodb/metadata/collectionSchema.test.ts +1 -0
- package/tests/integration/tools/mongodb/metadata/collectionStorageSize.test.ts +1 -0
- package/tests/integration/tools/mongodb/metadata/dbStats.test.ts +1 -0
- package/tests/integration/tools/mongodb/metadata/explain.test.ts +1 -0
- package/tests/integration/tools/mongodb/metadata/listCollections.test.ts +1 -0
- package/tests/integration/tools/mongodb/metadata/listDatabases.test.ts +3 -2
- package/tests/integration/tools/mongodb/metadata/logs.test.ts +1 -0
- package/tests/integration/tools/mongodb/mongodbHelpers.ts +66 -2
- package/tests/integration/tools/mongodb/read/aggregate.test.ts +2 -1
- package/tests/integration/tools/mongodb/read/collectionIndexes.test.ts +1 -0
- package/tests/integration/tools/mongodb/read/count.test.ts +1 -0
- package/tests/integration/tools/mongodb/read/find.test.ts +2 -1
- package/tests/integration/tools/mongodb/update/renameCollection.test.ts +1 -0
- package/tests/integration/tools/mongodb/update/updateMany.test.ts +1 -0
- package/tests/integration/transports/stdio.test.ts +40 -0
- package/tests/integration/transports/streamableHttp.test.ts +56 -0
- package/tests/matchers/toIncludeSameMembers.test.ts +59 -0
- package/tests/matchers/toIncludeSameMembers.ts +12 -0
- package/tests/setup.ts +7 -0
- package/tests/unit/accessListUtils.test.ts +39 -0
- package/tests/unit/accuracyScorer.test.ts +390 -0
- package/tests/unit/{apiClient.test.ts → common/apiClient.test.ts} +15 -15
- package/tests/unit/common/managedTimeout.test.ts +67 -0
- package/tests/unit/{session.test.ts → common/session.test.ts} +7 -12
- package/tests/unit/{indexCheck.test.ts → helpers/indexCheck.test.ts} +2 -1
- package/tests/unit/telemetry.test.ts +52 -42
- package/tests/unit/{EJsonTransport.test.ts → transports/stdio.test.ts} +4 -4
- package/tests/vitest.d.ts +11 -0
- package/tsconfig.json +0 -1
- package/{tsconfig.jest.json → tsconfig.test.json} +1 -2
- package/vitest.config.ts +41 -0
- package/dist/common/atlas/generatePassword.js.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/errors.js.map +0 -1
- package/dist/helpers/EJsonTransport.js.map +0 -1
- package/dist/helpers/packageInfo.js.map +0 -1
- package/dist/logger.js.map +0 -1
- package/dist/session.js.map +0 -1
- package/dist/tools/atlas/metadata/connectCluster.js +0 -100
- package/dist/tools/atlas/metadata/connectCluster.js.map +0 -1
- package/dist/tools/mongodb/metadata/connect.js.map +0 -1
- package/global.d.ts +0 -1
- package/jest.config.cjs +0 -22
- package/src/tools/atlas/metadata/connectCluster.ts +0 -121
- /package/dist/{errors.js → common/errors.js} +0 -0
- /package/dist/{helpers → common}/packageInfo.js +0 -0
- /package/dist/{common/atlas → helpers}/generatePassword.js +0 -0
- /package/src/{errors.ts → common/errors.ts} +0 -0
- /package/src/{helpers → common}/packageInfo.ts +0 -0
- /package/src/{common/atlas → helpers}/generatePassword.ts +0 -0
package/dist/tools/tool.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import logger, { LogId } from "../logger.js";
|
|
1
|
+
import logger, { LogId } from "../common/logger.js";
|
|
2
2
|
export class ToolBase {
|
|
3
3
|
get annotations() {
|
|
4
4
|
const annotations = {
|
|
@@ -8,6 +8,7 @@ export class ToolBase {
|
|
|
8
8
|
switch (this.operationType) {
|
|
9
9
|
case "read":
|
|
10
10
|
case "metadata":
|
|
11
|
+
case "connect":
|
|
11
12
|
annotations.readOnlyHint = true;
|
|
12
13
|
annotations.destructiveHint = false;
|
|
13
14
|
break;
|
|
@@ -32,7 +33,7 @@ export class ToolBase {
|
|
|
32
33
|
}
|
|
33
34
|
register(server) {
|
|
34
35
|
if (!this.verifyAllowed()) {
|
|
35
|
-
return;
|
|
36
|
+
return false;
|
|
36
37
|
}
|
|
37
38
|
const callback = async (...args) => {
|
|
38
39
|
const startTime = Date.now();
|
|
@@ -49,13 +50,14 @@ export class ToolBase {
|
|
|
49
50
|
return toolResult;
|
|
50
51
|
}
|
|
51
52
|
};
|
|
52
|
-
server.tool(this.name, this.description, this.argsShape, this.annotations, callback);
|
|
53
|
+
server.mcpServer.tool(this.name, this.description, this.argsShape, this.annotations, callback);
|
|
53
54
|
// This is very similar to RegisteredTool.update, but without the bugs around the name.
|
|
54
55
|
// In the upstream update method, the name is captured in the closure and not updated when
|
|
55
56
|
// the tool name changes. This means that you only get one name update before things end up
|
|
56
57
|
// in a broken state.
|
|
58
|
+
// See https://github.com/modelcontextprotocol/typescript-sdk/issues/414 for more details.
|
|
57
59
|
this.update = (updates) => {
|
|
58
|
-
const tools = server["_registeredTools"];
|
|
60
|
+
const tools = server.mcpServer["_registeredTools"];
|
|
59
61
|
const existingTool = tools[this.name];
|
|
60
62
|
if (!existingTool) {
|
|
61
63
|
logger.warning(LogId.toolUpdateFailure, "tool", `Tool ${this.name} not found in update`);
|
|
@@ -76,8 +78,9 @@ export class ToolBase {
|
|
|
76
78
|
if (updates.inputSchema) {
|
|
77
79
|
existingTool.inputSchema = updates.inputSchema;
|
|
78
80
|
}
|
|
79
|
-
server.sendToolListChanged();
|
|
81
|
+
server.mcpServer.sendToolListChanged();
|
|
80
82
|
};
|
|
83
|
+
return true;
|
|
81
84
|
}
|
|
82
85
|
// Checks if a tool is allowed to run based on the config
|
|
83
86
|
verifyAllowed() {
|
package/dist/tools/tool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/tools/tool.ts"],"names":[],"mappings":"AAIA,OAAO,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/tools/tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { packageInfo } from "../common/packageInfo.js";
|
|
2
|
+
import { Server } from "../server.js";
|
|
3
|
+
import { Session } from "../common/session.js";
|
|
4
|
+
import { Telemetry } from "../telemetry/telemetry.js";
|
|
5
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
+
export class TransportRunnerBase {
|
|
7
|
+
setupServer(userConfig) {
|
|
8
|
+
const session = new Session({
|
|
9
|
+
apiBaseUrl: userConfig.apiBaseUrl,
|
|
10
|
+
apiClientId: userConfig.apiClientId,
|
|
11
|
+
apiClientSecret: userConfig.apiClientSecret,
|
|
12
|
+
});
|
|
13
|
+
const telemetry = Telemetry.create(session, userConfig);
|
|
14
|
+
const mcpServer = new McpServer({
|
|
15
|
+
name: packageInfo.mcpServerName,
|
|
16
|
+
version: packageInfo.version,
|
|
17
|
+
});
|
|
18
|
+
return new Server({
|
|
19
|
+
mcpServer,
|
|
20
|
+
session,
|
|
21
|
+
telemetry,
|
|
22
|
+
userConfig,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/transports/base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,MAAM,OAAgB,mBAAmB;IAC3B,WAAW,CAAC,UAAsB;QACxC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;YACxB,UAAU,EAAE,UAAU,CAAC,UAAU;YACjC,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,eAAe,EAAE,UAAU,CAAC,eAAe;SAC9C,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAExD,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;YAC5B,IAAI,EAAE,WAAW,CAAC,aAAa;YAC/B,OAAO,EAAE,WAAW,CAAC,OAAO;SAC/B,CAAC,CAAC;QAEH,OAAO,IAAI,MAAM,CAAC;YACd,SAAS;YACT,OAAO;YACP,SAAS;YACT,UAAU;SACb,CAAC,CAAC;IACP,CAAC;CAKJ"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import logger, { LogId } from "../common/logger.js";
|
|
2
|
+
import { TransportRunnerBase } from "./base.js";
|
|
1
3
|
import { JSONRPCMessageSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
2
4
|
import { EJSON } from "bson";
|
|
3
5
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
@@ -30,9 +32,29 @@ export class EJsonReadBuffer {
|
|
|
30
32
|
//
|
|
31
33
|
// This function creates a StdioServerTransport and replaces the internal readBuffer with EJsonReadBuffer
|
|
32
34
|
// that uses EJson.parse instead.
|
|
33
|
-
export function
|
|
35
|
+
export function createStdioTransport() {
|
|
34
36
|
const server = new StdioServerTransport();
|
|
35
37
|
server["_readBuffer"] = new EJsonReadBuffer();
|
|
36
38
|
return server;
|
|
37
39
|
}
|
|
38
|
-
|
|
40
|
+
export class StdioRunner extends TransportRunnerBase {
|
|
41
|
+
constructor(userConfig) {
|
|
42
|
+
super();
|
|
43
|
+
this.userConfig = userConfig;
|
|
44
|
+
}
|
|
45
|
+
async start() {
|
|
46
|
+
try {
|
|
47
|
+
this.server = this.setupServer(this.userConfig);
|
|
48
|
+
const transport = createStdioTransport();
|
|
49
|
+
await this.server.connect(transport);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
logger.emergency(LogId.serverStartFailure, "server", `Fatal error running server: ${error}`);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async close() {
|
|
57
|
+
await this.server?.close();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=stdio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/transports/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAkB,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1F,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAGjF,qEAAqE;AACrE,qEAAqE;AACrE,MAAM,OAAO,eAAe;IAGxB,MAAM,CAAC,KAAa;QAChB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/E,CAAC;IAED,WAAW;QACP,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAEhD,uEAAuE;QACvE,OAAO,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK;QACD,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC7B,CAAC;CACJ;AAED,6FAA6F;AAC7F,mFAAmF;AACnF,2FAA2F;AAC3F,EAAE;AACF,yGAAyG;AACzG,iCAAiC;AACjC,MAAM,UAAU,oBAAoB;IAChC,MAAM,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC1C,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;IAE9C,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,WAAY,SAAQ,mBAAmB;IAGhD,YAAoB,UAAsB;QACtC,KAAK,EAAE,CAAC;QADQ,eAAU,GAAV,UAAU,CAAY;IAE1C,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEhD,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;YAEzC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,kBAAkB,EAAE,QAAQ,EAAE,+BAA+B,KAAe,EAAE,CAAC,CAAC;YACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACP,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IAC/B,CAAC;CACJ"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
3
|
+
import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
|
|
4
|
+
import { TransportRunnerBase } from "./base.js";
|
|
5
|
+
import logger, { LogId } from "../common/logger.js";
|
|
6
|
+
import { randomUUID } from "crypto";
|
|
7
|
+
import { SessionStore } from "../common/sessionStore.js";
|
|
8
|
+
const JSON_RPC_ERROR_CODE_PROCESSING_REQUEST_FAILED = -32000;
|
|
9
|
+
const JSON_RPC_ERROR_CODE_SESSION_ID_REQUIRED = -32001;
|
|
10
|
+
const JSON_RPC_ERROR_CODE_SESSION_ID_INVALID = -32002;
|
|
11
|
+
const JSON_RPC_ERROR_CODE_SESSION_NOT_FOUND = -32003;
|
|
12
|
+
const JSON_RPC_ERROR_CODE_INVALID_REQUEST = -32004;
|
|
13
|
+
function withErrorHandling(fn) {
|
|
14
|
+
return (req, res, next) => {
|
|
15
|
+
fn(req, res, next).catch((error) => {
|
|
16
|
+
logger.error(LogId.streamableHttpTransportRequestFailure, "streamableHttpTransport", `Error handling request: ${error instanceof Error ? error.message : String(error)}`);
|
|
17
|
+
res.status(400).json({
|
|
18
|
+
jsonrpc: "2.0",
|
|
19
|
+
error: {
|
|
20
|
+
code: JSON_RPC_ERROR_CODE_PROCESSING_REQUEST_FAILED,
|
|
21
|
+
message: `failed to handle request`,
|
|
22
|
+
data: error instanceof Error ? error.message : String(error),
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export class StreamableHttpRunner extends TransportRunnerBase {
|
|
29
|
+
constructor(userConfig) {
|
|
30
|
+
super();
|
|
31
|
+
this.userConfig = userConfig;
|
|
32
|
+
this.sessionStore = new SessionStore(this.userConfig.idleTimeoutMs, this.userConfig.notificationTimeoutMs);
|
|
33
|
+
}
|
|
34
|
+
async start() {
|
|
35
|
+
const app = express();
|
|
36
|
+
app.enable("trust proxy"); // needed for reverse proxy support
|
|
37
|
+
app.use(express.json());
|
|
38
|
+
const handleSessionRequest = async (req, res) => {
|
|
39
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
40
|
+
if (!sessionId) {
|
|
41
|
+
res.status(400).json({
|
|
42
|
+
jsonrpc: "2.0",
|
|
43
|
+
error: {
|
|
44
|
+
code: JSON_RPC_ERROR_CODE_SESSION_ID_REQUIRED,
|
|
45
|
+
message: `session id is required`,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (typeof sessionId !== "string") {
|
|
51
|
+
res.status(400).json({
|
|
52
|
+
jsonrpc: "2.0",
|
|
53
|
+
error: {
|
|
54
|
+
code: JSON_RPC_ERROR_CODE_SESSION_ID_INVALID,
|
|
55
|
+
message: `session id is invalid`,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const transport = this.sessionStore.getSession(sessionId);
|
|
61
|
+
if (!transport) {
|
|
62
|
+
res.status(404).json({
|
|
63
|
+
jsonrpc: "2.0",
|
|
64
|
+
error: {
|
|
65
|
+
code: JSON_RPC_ERROR_CODE_SESSION_NOT_FOUND,
|
|
66
|
+
message: `session not found`,
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
await transport.handleRequest(req, res, req.body);
|
|
72
|
+
};
|
|
73
|
+
app.post("/mcp", withErrorHandling(async (req, res) => {
|
|
74
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
75
|
+
if (sessionId) {
|
|
76
|
+
await handleSessionRequest(req, res);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (!isInitializeRequest(req.body)) {
|
|
80
|
+
res.status(400).json({
|
|
81
|
+
jsonrpc: "2.0",
|
|
82
|
+
error: {
|
|
83
|
+
code: JSON_RPC_ERROR_CODE_INVALID_REQUEST,
|
|
84
|
+
message: `invalid request`,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const server = this.setupServer(this.userConfig);
|
|
90
|
+
const transport = new StreamableHTTPServerTransport({
|
|
91
|
+
sessionIdGenerator: () => randomUUID().toString(),
|
|
92
|
+
onsessioninitialized: (sessionId) => {
|
|
93
|
+
this.sessionStore.setSession(sessionId, transport, server.mcpServer);
|
|
94
|
+
},
|
|
95
|
+
onsessionclosed: async (sessionId) => {
|
|
96
|
+
try {
|
|
97
|
+
await this.sessionStore.closeSession(sessionId, false);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
logger.error(LogId.streamableHttpTransportSessionCloseFailure, "streamableHttpTransport", `Error closing session: ${error instanceof Error ? error.message : String(error)}`);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
transport.onclose = () => {
|
|
105
|
+
server.close().catch((error) => {
|
|
106
|
+
logger.error(LogId.streamableHttpTransportCloseFailure, "streamableHttpTransport", `Error closing server: ${error instanceof Error ? error.message : String(error)}`);
|
|
107
|
+
});
|
|
108
|
+
};
|
|
109
|
+
await server.connect(transport);
|
|
110
|
+
await transport.handleRequest(req, res, req.body);
|
|
111
|
+
}));
|
|
112
|
+
app.get("/mcp", withErrorHandling(handleSessionRequest));
|
|
113
|
+
app.delete("/mcp", withErrorHandling(handleSessionRequest));
|
|
114
|
+
this.httpServer = await new Promise((resolve, reject) => {
|
|
115
|
+
const result = app.listen(this.userConfig.httpPort, this.userConfig.httpHost, (err) => {
|
|
116
|
+
if (err) {
|
|
117
|
+
reject(err);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
resolve(result);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
logger.info(LogId.streamableHttpTransportStarted, "streamableHttpTransport", `Server started on http://${this.userConfig.httpHost}:${this.userConfig.httpPort}`);
|
|
124
|
+
}
|
|
125
|
+
async close() {
|
|
126
|
+
await Promise.all([
|
|
127
|
+
this.sessionStore.closeAllSessions(),
|
|
128
|
+
new Promise((resolve, reject) => {
|
|
129
|
+
this.httpServer?.close((err) => {
|
|
130
|
+
if (err) {
|
|
131
|
+
reject(err);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
resolve();
|
|
135
|
+
});
|
|
136
|
+
}),
|
|
137
|
+
]);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=streamableHttp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamableHttp.js","sourceRoot":"","sources":["../../src/transports/streamableHttp.ts"],"names":[],"mappings":"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"}
|
package/eslint.config.js
CHANGED
|
@@ -3,7 +3,7 @@ import js from "@eslint/js";
|
|
|
3
3
|
import globals from "globals";
|
|
4
4
|
import tseslint from "typescript-eslint";
|
|
5
5
|
import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended";
|
|
6
|
-
import
|
|
6
|
+
import vitestPlugin from "@vitest/eslint-plugin";
|
|
7
7
|
|
|
8
8
|
const testFiles = ["tests/**/*.test.ts", "tests/**/*.ts"];
|
|
9
9
|
|
|
@@ -15,14 +15,23 @@ export default defineConfig([
|
|
|
15
15
|
{
|
|
16
16
|
files: testFiles,
|
|
17
17
|
plugins: {
|
|
18
|
-
|
|
18
|
+
vitest: vitestPlugin,
|
|
19
19
|
},
|
|
20
20
|
languageOptions: {
|
|
21
21
|
globals: {
|
|
22
22
|
...globals.node,
|
|
23
|
-
...jestPlugin.environments.globals.globals,
|
|
24
23
|
},
|
|
25
24
|
},
|
|
25
|
+
rules: {
|
|
26
|
+
...vitestPlugin.configs.recommended.rules,
|
|
27
|
+
"vitest/valid-title": "off",
|
|
28
|
+
"vitest/expect-expect": [
|
|
29
|
+
"error",
|
|
30
|
+
{
|
|
31
|
+
assertFunctionNames: ["expect", "expectDefined", "verifyMockCalls"],
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
},
|
|
26
35
|
},
|
|
27
36
|
tseslint.configs.recommendedTypeChecked,
|
|
28
37
|
{
|
|
@@ -48,7 +57,7 @@ export default defineConfig([
|
|
|
48
57
|
"coverage",
|
|
49
58
|
"global.d.ts",
|
|
50
59
|
"eslint.config.js",
|
|
51
|
-
"
|
|
60
|
+
"vitest.config.ts",
|
|
52
61
|
"src/types/*.d.ts",
|
|
53
62
|
]),
|
|
54
63
|
eslintPluginPrettierRecommended,
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mongodb-mcp-server",
|
|
3
3
|
"description": "MongoDB Model Context Protocol Server",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.0",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"author": "MongoDB <info@mongodb.com>",
|
|
7
7
|
"homepage": "https://github.com/mongodb-js/mongodb-mcp-server",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
},
|
|
17
17
|
"type": "module",
|
|
18
18
|
"scripts": {
|
|
19
|
+
"start": "node dist/index.js --transport http --loggers stderr mcp",
|
|
19
20
|
"prepare": "npm run build",
|
|
20
21
|
"build:clean": "rm -rf dist",
|
|
21
22
|
"build:compile": "tsc --project tsconfig.build.json",
|
|
@@ -29,55 +30,64 @@
|
|
|
29
30
|
"check:types": "tsc --noEmit --project tsconfig.json",
|
|
30
31
|
"reformat": "prettier --write .",
|
|
31
32
|
"generate": "./scripts/generate.sh",
|
|
32
|
-
"test": "
|
|
33
|
+
"test": "vitest --project unit-and-integration --coverage",
|
|
34
|
+
"pretest:accuracy": "npm run build:compile",
|
|
35
|
+
"test:accuracy": "sh ./scripts/accuracy/runAccuracyTests.sh"
|
|
33
36
|
},
|
|
34
37
|
"license": "Apache-2.0",
|
|
35
38
|
"devDependencies": {
|
|
36
|
-
"@
|
|
37
|
-
"@
|
|
38
|
-
"@
|
|
39
|
-
"@
|
|
40
|
-
"@
|
|
41
|
-
"@
|
|
39
|
+
"@ai-sdk/azure": "^1.3.24",
|
|
40
|
+
"@ai-sdk/google": "^1.2.22",
|
|
41
|
+
"@ai-sdk/openai": "^1.3.23",
|
|
42
|
+
"@eslint/js": "^9.30.1",
|
|
43
|
+
"@modelcontextprotocol/inspector": "^0.16.0",
|
|
44
|
+
"@redocly/cli": "^1.34.4",
|
|
45
|
+
"@types/express": "^5.0.1",
|
|
46
|
+
"@types/node": "^24.0.12",
|
|
47
|
+
"@types/proper-lockfile": "^4.1.4",
|
|
42
48
|
"@types/simple-oauth2": "^5.0.7",
|
|
43
49
|
"@types/yargs-parser": "^21.0.3",
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"eslint
|
|
47
|
-
"eslint-
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"mongodb-runner": "^5.8.2",
|
|
50
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
51
|
+
"ai": "^4.3.17",
|
|
52
|
+
"eslint": "^9.30.1",
|
|
53
|
+
"eslint-config-prettier": "^10.1.5",
|
|
54
|
+
"eslint-plugin-prettier": "^5.5.1",
|
|
55
|
+
"globals": "^16.3.0",
|
|
56
|
+
"mongodb-runner": "^5.9.2",
|
|
57
|
+
"ollama-ai-provider": "^1.2.0",
|
|
53
58
|
"openapi-types": "^12.1.3",
|
|
54
|
-
"openapi-typescript": "^7.
|
|
55
|
-
"prettier": "^3.
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"typescript
|
|
60
|
-
"
|
|
59
|
+
"openapi-typescript": "^7.8.0",
|
|
60
|
+
"prettier": "^3.6.2",
|
|
61
|
+
"proper-lockfile": "^4.1.2",
|
|
62
|
+
"simple-git": "^3.28.0",
|
|
63
|
+
"tsx": "^4.20.3",
|
|
64
|
+
"typescript": "^5.8.3",
|
|
65
|
+
"typescript-eslint": "^8.36.0",
|
|
66
|
+
"vitest": "^3.2.4",
|
|
67
|
+
"uuid": "^11.1.0",
|
|
68
|
+
"yaml": "^2.8.0"
|
|
61
69
|
},
|
|
62
70
|
"dependencies": {
|
|
63
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
64
|
-
"@mongodb-js/device-id": "^0.
|
|
65
|
-
"@mongodb-js/devtools-connect": "^3.
|
|
66
|
-
"@mongosh/service-provider-node-driver": "^3.
|
|
67
|
-
"
|
|
71
|
+
"@modelcontextprotocol/sdk": "^1.15.0",
|
|
72
|
+
"@mongodb-js/device-id": "^0.3.1",
|
|
73
|
+
"@mongodb-js/devtools-connect": "^3.9.2",
|
|
74
|
+
"@mongosh/service-provider-node-driver": "^3.10.2",
|
|
75
|
+
"@vitest/eslint-plugin": "^1.3.4",
|
|
76
|
+
"bson": "^6.10.4",
|
|
77
|
+
"express": "^5.1.0",
|
|
68
78
|
"lru-cache": "^11.1.0",
|
|
69
|
-
"mongodb": "^6.
|
|
79
|
+
"mongodb": "^6.17.0",
|
|
70
80
|
"mongodb-connection-string-url": "^3.0.2",
|
|
71
81
|
"mongodb-log-writer": "^2.4.1",
|
|
72
|
-
"mongodb-redact": "^1.1.
|
|
82
|
+
"mongodb-redact": "^1.1.8",
|
|
73
83
|
"mongodb-schema": "^12.6.2",
|
|
74
84
|
"node-machine-id": "1.1.12",
|
|
75
85
|
"openapi-fetch": "^0.14.0",
|
|
76
86
|
"simple-oauth2": "^5.1.0",
|
|
77
87
|
"yargs-parser": "^22.0.0",
|
|
78
|
-
"zod": "^3.
|
|
88
|
+
"zod": "^3.25.76"
|
|
79
89
|
},
|
|
80
90
|
"engines": {
|
|
81
|
-
"node": "
|
|
91
|
+
"node": "^20.19.0 || ^22.12.0 || >= 23.0.0"
|
|
82
92
|
}
|
|
83
93
|
}
|