@universal-mcp-toolkit/server-mongodb 0.1.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.
@@ -0,0 +1,35 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/json",
3
+ "name": "mongodb",
4
+ "title": "MongoDB MCP Server",
5
+ "description": "Database, collection, and document tools for MongoDB.",
6
+ "version": "0.1.0",
7
+ "transports": [
8
+ "stdio",
9
+ "http+sse"
10
+ ],
11
+ "authentication": {
12
+ "mode": "environment-variables",
13
+ "required": [
14
+ "MONGODB_URI"
15
+ ]
16
+ },
17
+ "capabilities": {
18
+ "tools": true,
19
+ "resources": true,
20
+ "prompts": true
21
+ },
22
+ "packageName": "@universal-mcp-toolkit/server-mongodb",
23
+ "homepage": "https://github.com/universal-mcp-toolkit/universal-mcp-toolkit#readme",
24
+ "tools": [
25
+ "list-collections",
26
+ "find-documents",
27
+ "aggregate-documents"
28
+ ],
29
+ "resources": [
30
+ "cluster-overview"
31
+ ],
32
+ "prompts": [
33
+ "data-summary"
34
+ ]
35
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 universal-mcp-toolkit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,74 @@
1
+ import * as _universal_mcp_toolkit_core from '@universal-mcp-toolkit/core';
2
+ import { ToolkitServer, ToolkitServerMetadata } from '@universal-mcp-toolkit/core';
3
+ import { z } from 'zod';
4
+
5
+ type JsonPrimitive = boolean | number | string | null;
6
+ interface JsonObject {
7
+ [key: string]: JsonValue;
8
+ }
9
+ type JsonValue = JsonPrimitive | JsonObject | JsonValue[];
10
+ declare const mongodbEnvShape: {
11
+ MONGODB_URI: z.ZodString;
12
+ MONGODB_DATABASE: z.ZodOptional<z.ZodString>;
13
+ MONGODB_ALLOW_WRITE_PIPELINES: z.ZodPipe<z.ZodDefault<z.ZodEnum<{
14
+ true: "true";
15
+ false: "false";
16
+ }>>, z.ZodTransform<boolean, "true" | "false">>;
17
+ MONGODB_MAX_DOCUMENTS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
18
+ MONGODB_RESOURCE_COLLECTION_LIMIT: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
19
+ };
20
+ type MongoDbEnv = z.infer<z.ZodObject<typeof mongodbEnvShape>>;
21
+ interface MongoDbCollectionSummary {
22
+ name: string;
23
+ type: string;
24
+ options: JsonObject;
25
+ }
26
+ interface MongoDbDocumentBatch {
27
+ database: string;
28
+ collection: string;
29
+ documents: JsonObject[];
30
+ }
31
+ interface MongoDbClient {
32
+ listCollections(input: {
33
+ database: string;
34
+ namePrefix?: string;
35
+ limit: number;
36
+ }): Promise<{
37
+ database: string;
38
+ collections: MongoDbCollectionSummary[];
39
+ }>;
40
+ findDocuments(input: {
41
+ database: string;
42
+ collection: string;
43
+ filter: JsonObject;
44
+ projection: JsonObject;
45
+ sort: JsonObject;
46
+ limit: number;
47
+ skip: number;
48
+ }): Promise<MongoDbDocumentBatch>;
49
+ aggregateDocuments(input: {
50
+ database: string;
51
+ collection: string;
52
+ pipeline: readonly JsonObject[];
53
+ limit: number;
54
+ }): Promise<MongoDbDocumentBatch>;
55
+ close?(): Promise<void>;
56
+ }
57
+ declare const metadata: ToolkitServerMetadata;
58
+ declare const serverCard: _universal_mcp_toolkit_core.ToolkitServerCard;
59
+ declare class MongoDbServer extends ToolkitServer {
60
+ private readonly env;
61
+ private readonly client;
62
+ constructor(env: MongoDbEnv, client: MongoDbClient);
63
+ close(): Promise<void>;
64
+ private getDefaultDatabaseName;
65
+ private resolveDatabaseName;
66
+ }
67
+ interface CreateMongoDbServerOptions {
68
+ env?: MongoDbEnv;
69
+ client?: MongoDbClient;
70
+ }
71
+ declare function createServer(options?: CreateMongoDbServerOptions): MongoDbServer;
72
+ declare function main(argv?: readonly string[]): Promise<void>;
73
+
74
+ export { type CreateMongoDbServerOptions, type JsonObject, type JsonValue, type MongoDbClient, type MongoDbCollectionSummary, type MongoDbDocumentBatch, type MongoDbEnv, MongoDbServer, createServer, main, metadata, serverCard };
package/dist/index.js ADDED
@@ -0,0 +1,455 @@
1
+ // src/index.ts
2
+ import { pathToFileURL } from "url";
3
+ import {
4
+ ConfigurationError,
5
+ ExternalServiceError,
6
+ ToolkitServer,
7
+ ValidationError,
8
+ createServerCard,
9
+ defineTool,
10
+ loadEnv,
11
+ parseRuntimeOptions,
12
+ runToolkitServer
13
+ } from "@universal-mcp-toolkit/core";
14
+ import { MongoClient } from "mongodb";
15
+ import { z } from "zod";
16
+ var jsonValueSchema = z.lazy(
17
+ () => z.union([z.string(), z.number().finite(), z.boolean(), z.null(), z.array(jsonValueSchema), z.record(z.string(), jsonValueSchema)])
18
+ );
19
+ var jsonObjectSchema = z.record(z.string(), jsonValueSchema);
20
+ var booleanFlag = z.enum(["true", "false"]).default("false").transform((value) => value === "true");
21
+ var mongodbEnvShape = {
22
+ MONGODB_URI: z.string().min(1),
23
+ MONGODB_DATABASE: z.string().min(1).optional(),
24
+ MONGODB_ALLOW_WRITE_PIPELINES: booleanFlag,
25
+ MONGODB_MAX_DOCUMENTS: z.coerce.number().int().positive().max(200).default(50),
26
+ MONGODB_RESOURCE_COLLECTION_LIMIT: z.coerce.number().int().positive().max(100).default(25)
27
+ };
28
+ var TOOL_NAMES = ["aggregate-documents", "find-documents", "list-collections"];
29
+ var RESOURCE_NAMES = ["cluster-overview"];
30
+ var PROMPT_NAMES = ["data-summary"];
31
+ var metadata = {
32
+ id: "mongodb",
33
+ title: "MongoDB MCP Server",
34
+ description: "Database, collection, and document tools for MongoDB.",
35
+ version: "0.1.0",
36
+ packageName: "@universal-mcp-toolkit/server-mongodb",
37
+ homepage: "https://github.com/universal-mcp-toolkit/universal-mcp-toolkit#readme",
38
+ repositoryUrl: "https://github.com/universal-mcp-toolkit/universal-mcp-toolkit",
39
+ envVarNames: ["MONGODB_URI"],
40
+ transports: ["stdio", "sse"],
41
+ toolNames: TOOL_NAMES,
42
+ resourceNames: RESOURCE_NAMES,
43
+ promptNames: PROMPT_NAMES
44
+ };
45
+ var serverCard = createServerCard(metadata);
46
+ function extractErrorMessage(error) {
47
+ if (error instanceof Error) {
48
+ return error.message;
49
+ }
50
+ return "Unknown MongoDB error.";
51
+ }
52
+ function getDefaultDatabaseFromUri(uri) {
53
+ const match = uri.match(/^[a-z0-9+.-]+:\/\/(?:[^@/]+@)?[^/]+\/([^?]+)/iu);
54
+ const database = match?.[1];
55
+ if (!database || database === "") {
56
+ return void 0;
57
+ }
58
+ return decodeURIComponent(database);
59
+ }
60
+ function maskMongoUri(uri) {
61
+ return uri.replace(/\/\/[^@/]+@/u, "//***:***@");
62
+ }
63
+ function hasToHexString(value) {
64
+ return "toHexString" in value && typeof value.toHexString === "function";
65
+ }
66
+ function hasToJson(value) {
67
+ return "toJSON" in value && typeof value.toJSON === "function";
68
+ }
69
+ function sanitizeJsonValue(value) {
70
+ if (value === null || typeof value === "string" || typeof value === "boolean") {
71
+ return value;
72
+ }
73
+ if (typeof value === "number") {
74
+ return Number.isFinite(value) ? value : String(value);
75
+ }
76
+ if (typeof value === "bigint") {
77
+ return value.toString();
78
+ }
79
+ if (value instanceof Date) {
80
+ return value.toISOString();
81
+ }
82
+ if (value instanceof Uint8Array) {
83
+ return Buffer.from(value).toString("base64");
84
+ }
85
+ if (Array.isArray(value)) {
86
+ return value.map((entry) => sanitizeJsonValue(entry));
87
+ }
88
+ if (typeof value === "object") {
89
+ if (hasToHexString(value)) {
90
+ return value.toHexString();
91
+ }
92
+ if (hasToJson(value)) {
93
+ const jsonValue = value.toJSON();
94
+ if (jsonValue !== value) {
95
+ return sanitizeJsonValue(jsonValue);
96
+ }
97
+ }
98
+ const result = {};
99
+ for (const [key, entry] of Object.entries(value)) {
100
+ result[key] = sanitizeJsonValue(entry);
101
+ }
102
+ return result;
103
+ }
104
+ return String(value);
105
+ }
106
+ function sanitizeJsonObject(value) {
107
+ const sanitized = sanitizeJsonValue(value);
108
+ if (sanitized !== null && typeof sanitized === "object" && !Array.isArray(sanitized)) {
109
+ return sanitized;
110
+ }
111
+ return {
112
+ value: sanitized
113
+ };
114
+ }
115
+ function pipelineContainsWriteStage(pipeline) {
116
+ return pipeline.some((stage) => Object.keys(stage).some((key) => key === "$merge" || key === "$out"));
117
+ }
118
+ var NodeMongoDbClient = class {
119
+ constructor(env) {
120
+ this.env = env;
121
+ this.client = new MongoClient(env.MONGODB_URI);
122
+ }
123
+ client;
124
+ connected = false;
125
+ async close() {
126
+ if (!this.connected) {
127
+ return;
128
+ }
129
+ await this.client.close();
130
+ this.connected = false;
131
+ }
132
+ async listCollections(input) {
133
+ const db = await this.getDatabase(input.database);
134
+ try {
135
+ const collections = await db.listCollections({}, { nameOnly: false }).toArray();
136
+ const filtered = collections.filter((collection) => input.namePrefix ? collection.name.startsWith(input.namePrefix) : true).slice(0, input.limit).map((collection) => ({
137
+ name: collection.name,
138
+ type: collection.type ?? "collection",
139
+ options: sanitizeJsonObject(collection.options)
140
+ }));
141
+ return {
142
+ database: input.database,
143
+ collections: filtered
144
+ };
145
+ } catch (error) {
146
+ throw new ExternalServiceError(`Failed to list collections for database '${input.database}'.`, {
147
+ details: extractErrorMessage(error)
148
+ });
149
+ }
150
+ }
151
+ async findDocuments(input) {
152
+ const db = await this.getDatabase(input.database);
153
+ try {
154
+ const options = {};
155
+ if (Object.keys(input.projection).length > 0) {
156
+ options.projection = input.projection;
157
+ }
158
+ const cursor = db.collection(input.collection).find(input.filter, options);
159
+ if (Object.keys(input.sort).length > 0) {
160
+ cursor.sort(input.sort);
161
+ }
162
+ if (input.skip > 0) {
163
+ cursor.skip(input.skip);
164
+ }
165
+ const documents = await cursor.limit(input.limit).toArray();
166
+ return {
167
+ database: input.database,
168
+ collection: input.collection,
169
+ documents: documents.map((document) => sanitizeJsonObject(document))
170
+ };
171
+ } catch (error) {
172
+ throw new ExternalServiceError(`Failed to query collection '${input.collection}'.`, {
173
+ details: extractErrorMessage(error)
174
+ });
175
+ }
176
+ }
177
+ async aggregateDocuments(input) {
178
+ const db = await this.getDatabase(input.database);
179
+ try {
180
+ const documents = await db.collection(input.collection).aggregate(input.pipeline).limit(input.limit).toArray();
181
+ return {
182
+ database: input.database,
183
+ collection: input.collection,
184
+ documents: documents.map((document) => sanitizeJsonObject(document))
185
+ };
186
+ } catch (error) {
187
+ throw new ExternalServiceError(`Failed to aggregate collection '${input.collection}'.`, {
188
+ details: extractErrorMessage(error)
189
+ });
190
+ }
191
+ }
192
+ async getDatabase(name) {
193
+ await this.ensureConnected();
194
+ return this.client.db(name);
195
+ }
196
+ async ensureConnected() {
197
+ if (this.connected) {
198
+ return;
199
+ }
200
+ try {
201
+ await this.client.connect();
202
+ this.connected = true;
203
+ } catch (error) {
204
+ throw new ExternalServiceError("Failed to connect to MongoDB.", {
205
+ details: extractErrorMessage(error)
206
+ });
207
+ }
208
+ }
209
+ };
210
+ var MongoDbServer = class extends ToolkitServer {
211
+ constructor(env, client) {
212
+ super(metadata);
213
+ this.env = env;
214
+ this.client = client;
215
+ this.registerTool(
216
+ defineTool({
217
+ name: "list-collections",
218
+ title: "List MongoDB collections",
219
+ description: "List collections in a MongoDB database with optional prefix filtering.",
220
+ inputSchema: {
221
+ database: z.string().min(1).optional(),
222
+ namePrefix: z.string().min(1).optional(),
223
+ limit: z.number().int().positive().max(100).default(25)
224
+ },
225
+ outputSchema: {
226
+ database: z.string(),
227
+ collectionCount: z.number().int().nonnegative(),
228
+ collections: z.array(
229
+ z.object({
230
+ name: z.string(),
231
+ type: z.string(),
232
+ options: jsonObjectSchema
233
+ })
234
+ )
235
+ },
236
+ handler: async ({ database, limit, namePrefix }, context) => {
237
+ const resolvedDatabase = this.resolveDatabaseName(database);
238
+ await context.log("info", `Listing collections for ${resolvedDatabase}.`);
239
+ const request = {
240
+ database: resolvedDatabase,
241
+ limit
242
+ };
243
+ if (namePrefix) {
244
+ request.namePrefix = namePrefix;
245
+ }
246
+ const result = await this.client.listCollections(request);
247
+ return {
248
+ database: result.database,
249
+ collectionCount: result.collections.length,
250
+ collections: result.collections
251
+ };
252
+ },
253
+ renderText: (output) => `${output.collectionCount} collections found in ${output.database}.`
254
+ })
255
+ );
256
+ this.registerTool(
257
+ defineTool({
258
+ name: "find-documents",
259
+ title: "Find MongoDB documents",
260
+ description: "Find documents in a MongoDB collection using a JSON filter and projection.",
261
+ inputSchema: {
262
+ database: z.string().min(1).optional(),
263
+ collection: z.string().min(1),
264
+ filter: jsonObjectSchema.default({}),
265
+ projection: jsonObjectSchema.default({}),
266
+ sort: jsonObjectSchema.default({}),
267
+ limit: z.number().int().positive().max(200).default(25),
268
+ skip: z.number().int().nonnegative().default(0)
269
+ },
270
+ outputSchema: {
271
+ database: z.string(),
272
+ collection: z.string(),
273
+ returnedDocuments: z.number().int().nonnegative(),
274
+ truncated: z.boolean(),
275
+ documents: z.array(jsonObjectSchema)
276
+ },
277
+ handler: async ({ collection, database, filter, limit, projection, skip, sort }, context) => {
278
+ const resolvedDatabase = this.resolveDatabaseName(database);
279
+ const cappedLimit = Math.min(limit, this.env.MONGODB_MAX_DOCUMENTS);
280
+ await context.log("info", `Finding documents in ${resolvedDatabase}.${collection}.`);
281
+ const result = await this.client.findDocuments({
282
+ database: resolvedDatabase,
283
+ collection,
284
+ filter,
285
+ projection,
286
+ sort,
287
+ limit: cappedLimit,
288
+ skip
289
+ });
290
+ return {
291
+ database: result.database,
292
+ collection: result.collection,
293
+ returnedDocuments: result.documents.length,
294
+ truncated: limit > cappedLimit,
295
+ documents: result.documents
296
+ };
297
+ },
298
+ renderText: (output) => `${output.returnedDocuments} documents returned from ${output.collection}.`
299
+ })
300
+ );
301
+ this.registerTool(
302
+ defineTool({
303
+ name: "aggregate-documents",
304
+ title: "Aggregate MongoDB documents",
305
+ description: "Run a MongoDB aggregation pipeline with write stages disabled by default.",
306
+ inputSchema: {
307
+ database: z.string().min(1).optional(),
308
+ collection: z.string().min(1),
309
+ pipeline: z.array(jsonObjectSchema).min(1),
310
+ limit: z.number().int().positive().max(200).default(25),
311
+ allowWriteStage: z.boolean().default(false)
312
+ },
313
+ outputSchema: {
314
+ database: z.string(),
315
+ collection: z.string(),
316
+ stageCount: z.number().int().positive(),
317
+ returnedDocuments: z.number().int().nonnegative(),
318
+ truncated: z.boolean(),
319
+ documents: z.array(jsonObjectSchema)
320
+ },
321
+ handler: async ({ allowWriteStage, collection, database, limit, pipeline }, context) => {
322
+ const resolvedDatabase = this.resolveDatabaseName(database);
323
+ const hasWriteStage = pipelineContainsWriteStage(pipeline);
324
+ if (hasWriteStage && (!this.env.MONGODB_ALLOW_WRITE_PIPELINES || !allowWriteStage)) {
325
+ throw new ValidationError(
326
+ "Aggregation pipelines with $out or $merge are blocked by default. Set MONGODB_ALLOW_WRITE_PIPELINES=true and pass allowWriteStage=true to opt in."
327
+ );
328
+ }
329
+ if (hasWriteStage) {
330
+ await context.log("warning", "Executing an opt-in MongoDB aggregation pipeline with write stages.");
331
+ } else {
332
+ await context.log("info", `Aggregating documents in ${resolvedDatabase}.${collection}.`);
333
+ }
334
+ const cappedLimit = Math.min(limit, this.env.MONGODB_MAX_DOCUMENTS);
335
+ const result = await this.client.aggregateDocuments({
336
+ database: resolvedDatabase,
337
+ collection,
338
+ pipeline,
339
+ limit: cappedLimit
340
+ });
341
+ return {
342
+ database: result.database,
343
+ collection: result.collection,
344
+ stageCount: pipeline.length,
345
+ returnedDocuments: result.documents.length,
346
+ truncated: limit > cappedLimit,
347
+ documents: result.documents
348
+ };
349
+ },
350
+ renderText: (output) => `${output.returnedDocuments} aggregated documents returned from ${output.collection}.`
351
+ })
352
+ );
353
+ this.registerStaticResource(
354
+ "cluster-overview",
355
+ "mongodb://cluster-overview",
356
+ {
357
+ title: "MongoDB cluster overview",
358
+ description: "A lightweight summary of the configured MongoDB cluster and default database.",
359
+ mimeType: "application/json"
360
+ },
361
+ async () => {
362
+ const defaultDatabase = this.getDefaultDatabaseName();
363
+ const collections = defaultDatabase === null ? [] : (await this.client.listCollections({
364
+ database: defaultDatabase,
365
+ limit: this.env.MONGODB_RESOURCE_COLLECTION_LIMIT
366
+ })).collections;
367
+ return this.createJsonResource("mongodb://cluster-overview", {
368
+ connectionString: maskMongoUri(this.env.MONGODB_URI),
369
+ defaultDatabase,
370
+ writePipelinesEnabled: this.env.MONGODB_ALLOW_WRITE_PIPELINES,
371
+ collections
372
+ });
373
+ }
374
+ );
375
+ this.registerPrompt(
376
+ "data-summary",
377
+ {
378
+ title: "MongoDB data summary",
379
+ description: "Draft a focused investigation prompt for summarizing MongoDB documents.",
380
+ argsSchema: {
381
+ collection: z.string().min(1),
382
+ focus: z.string().min(1),
383
+ sampleSize: z.number().int().positive().max(100).default(20)
384
+ }
385
+ },
386
+ async ({ collection, focus, sampleSize }) => this.createTextPrompt(
387
+ [
388
+ "Use the MongoDB tools to produce a concise data summary.",
389
+ `Collection: ${collection}`,
390
+ `Focus area: ${focus}`,
391
+ `Suggested sample size: ${sampleSize}`,
392
+ `Default database: ${this.getDefaultDatabaseName() ?? "not configured"}`,
393
+ "Look for:",
394
+ "- common document shapes and optional fields",
395
+ "- schema drift or surprising value distributions",
396
+ "- timestamps, status fields, and identifiers worth drilling into",
397
+ "- whether an aggregation pipeline or targeted find query would answer the question fastest"
398
+ ].join("\n")
399
+ )
400
+ );
401
+ }
402
+ async close() {
403
+ await this.client.close?.();
404
+ await super.close();
405
+ }
406
+ getDefaultDatabaseName() {
407
+ return this.env.MONGODB_DATABASE ?? getDefaultDatabaseFromUri(this.env.MONGODB_URI) ?? null;
408
+ }
409
+ resolveDatabaseName(database) {
410
+ const resolved = database ?? this.getDefaultDatabaseName();
411
+ if (!resolved) {
412
+ throw new ConfigurationError(
413
+ "No MongoDB database was provided. Supply a database argument or configure MONGODB_DATABASE."
414
+ );
415
+ }
416
+ return resolved;
417
+ }
418
+ };
419
+ function createServer(options = {}) {
420
+ const env = options.env ?? loadEnv(mongodbEnvShape);
421
+ const client = options.client ?? new NodeMongoDbClient(env);
422
+ return new MongoDbServer(env, client);
423
+ }
424
+ async function main(argv = process.argv.slice(2)) {
425
+ const env = loadEnv(mongodbEnvShape);
426
+ const runtimeOptions = parseRuntimeOptions(argv);
427
+ await runToolkitServer(
428
+ {
429
+ createServer: () => createServer({ env }),
430
+ serverCard
431
+ },
432
+ runtimeOptions
433
+ );
434
+ }
435
+ function isMainModule() {
436
+ const entryPoint = process.argv[1];
437
+ if (!entryPoint) {
438
+ return false;
439
+ }
440
+ return import.meta.url === pathToFileURL(entryPoint).href;
441
+ }
442
+ if (isMainModule()) {
443
+ void main().catch((error) => {
444
+ const message = error instanceof Error ? error.message : "Unknown startup error.";
445
+ console.error(`Failed to start MongoDB MCP server: ${message}`);
446
+ process.exitCode = 1;
447
+ });
448
+ }
449
+ export {
450
+ MongoDbServer,
451
+ createServer,
452
+ main,
453
+ metadata,
454
+ serverCard
455
+ };
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@universal-mcp-toolkit/server-mongodb",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Database, collection, and document tools for MongoDB.",
6
+ "license": "MIT",
7
+ "bin": {
8
+ "server-mongodb": "./dist/index.js",
9
+ "umt-mongodb": "./dist/index.js"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/Markgatcha/universal-mcp-toolkit.git"
14
+ },
15
+ "homepage": "https://github.com/Markgatcha/universal-mcp-toolkit#readme",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/index.js"
20
+ },
21
+ "./package.json": "./package.json"
22
+ },
23
+ "files": [
24
+ "dist",
25
+ ".well-known"
26
+ ],
27
+ "keywords": [
28
+ "mcp",
29
+ "model-context-protocol",
30
+ "ai",
31
+ "developer-tools",
32
+ "typescript",
33
+ "mongodb",
34
+ "database",
35
+ "documents",
36
+ "nosql"
37
+ ],
38
+ "dependencies": {
39
+ "@universal-mcp-toolkit/core": "0.1.0",
40
+ "mongodb": "^7.1.0",
41
+ "zod": "^4.3.6"
42
+ },
43
+ "publishConfig": {
44
+ "access": "public"
45
+ },
46
+ "scripts": {
47
+ "build": "tsup src/index.ts --format esm --dts --clean",
48
+ "dev": "tsx watch src/index.ts",
49
+ "lint": "tsc --noEmit",
50
+ "typecheck": "tsc --noEmit",
51
+ "test": "vitest run --passWithNoTests",
52
+ "clean": "rimraf dist"
53
+ }
54
+ }