@dbx-app/mcp-server 0.4.26 → 0.4.27

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/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
4
  import { createRequire } from "node:module";
5
5
  import { z } from "zod";
6
- import { buildSchemaContext, createBackend, evaluateRedisCommandSafety, evaluateMongoAggregateSafety, evaluateSqlSafety, formatCell, formatSchemaContext, isMainModule, mdTable, notifyReload, parseMongoAggregateCommand, postBridge, sqlSafetyFromEnv, splitSqlStatements, } from "@dbx-app/node-core";
6
+ import { buildSchemaContext, createBackend, evaluateRedisCommandSafety, evaluateMongoAggregateSafety, evaluateSqlSafety, formatCell, formatSchemaContext, isMainModule, mdTable, notifyReload, parseMongoAggregateCommand, assessProductionSql, isLikelyMongoMutation, isProductionDatabase, postBridge, sqlSafetyFromEnv, splitSqlStatements, } from "@dbx-app/node-core";
7
7
  const require = createRequire(import.meta.url);
8
8
  const packageJson = require("../package.json");
9
9
  export const DBX_MCP_PACKAGE_VERSION = packageJson.version ?? "0.0.0";
@@ -185,6 +185,13 @@ export function createDbxMcpServer(backend, options = {}) {
185
185
  const safety = evaluateSqlSafety(sql, { ...sqlSafetyFromEnv(), allowMultipleStatements: true });
186
186
  if (!safety.allowed)
187
187
  return toolError("SQL_BLOCKED", safety.reason ?? "SQL blocked.");
188
+ const production = assessProductionSql(sql, scopedConfig, database ?? scope.database ?? scopedConfig.database);
189
+ if (production.active && production.isMutation) {
190
+ return toolError("PRODUCTION_WRITE_BLOCKED", "MCP cannot execute writes against a production database. Return the SQL for a user to review and run in DBX.");
191
+ }
192
+ }
193
+ else if (isProductionDatabase(scopedConfig, database ?? scope.database ?? scopedConfig.database) && isLikelyMongoMutation(sql)) {
194
+ return toolError("PRODUCTION_WRITE_BLOCKED", "MCP cannot execute writes against a production database. Return the command for a user to review and run in DBX.");
188
195
  }
189
196
  // MongoDB shell commands don't fit the SQL safety evaluator; the backend
190
197
  // (node-core executeQuery) applies command-aware read/write gating.
@@ -222,6 +229,9 @@ export function createDbxMcpServer(backend, options = {}) {
222
229
  const safety = evaluateRedisCommandSafety(command, sqlSafetyFromEnv());
223
230
  if (!safety.allowed)
224
231
  return toolError("REDIS_COMMAND_BLOCKED", safety.reason ?? "Redis command blocked.");
232
+ if (isProductionDatabase(scopedConfig, String(defaultRedisDb(scopedConfig, scope, db))) && safety.safety !== "allowed") {
233
+ return toolError("PRODUCTION_WRITE_BLOCKED", "MCP cannot execute write or dangerous Redis commands against a production database.");
234
+ }
225
235
  try {
226
236
  const result = await backend.executeRedisCommand(scopedConfig, defaultRedisDb(scopedConfig, scope, db), command, {
227
237
  skipSafetyCheck: safety.skipSafetyCheck,
@@ -406,6 +416,17 @@ export function createDbxMcpServer(backend, options = {}) {
406
416
  if (!safety.allowed)
407
417
  return toolError("SQL_BLOCKED", safety.reason ?? "SQL blocked.");
408
418
  }
419
+ if (config?.db_type === "mongodb") {
420
+ if (isProductionDatabase(config, database ?? scope.database ?? config.database) && isLikelyMongoMutation(sql)) {
421
+ return toolError("PRODUCTION_WRITE_BLOCKED", "MCP cannot send writes against a production database to DBX.");
422
+ }
423
+ }
424
+ else {
425
+ const production = assessProductionSql(sql, config, database ?? scope.database ?? config.database);
426
+ if (production.active && production.isMutation) {
427
+ return toolError("PRODUCTION_WRITE_BLOCKED", "MCP cannot send writes against a production database to DBX.");
428
+ }
429
+ }
409
430
  // MongoDB shell commands bypass the SQL safety evaluator; pass MCP
410
431
  // safety flags to the desktop executor for command-aware gating.
411
432
  return bridgeRequest("/execute-query", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dbx-app/mcp-server",
3
- "version": "0.4.26",
3
+ "version": "0.4.27",
4
4
  "description": "MCP server for DBX — query databases from Claude Code, Cursor, and other AI agents",
5
5
  "keywords": [
6
6
  "ai-agent",
@@ -30,7 +30,7 @@
30
30
  "dependencies": {
31
31
  "@modelcontextprotocol/sdk": "^1.12.1",
32
32
  "zod": "^3.25.20",
33
- "@dbx-app/node-core": "^0.4.26"
33
+ "@dbx-app/node-core": "^0.4.27"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@types/node": "^22.15.21",
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/t8y2/dbx",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.4.26",
9
+ "version": "0.4.27",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@dbx-app/mcp-server",
14
- "version": "0.4.26",
14
+ "version": "0.4.27",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  }