SQL防护代理服务

sql-mcp是一个针对SQL数据库的模型上下文协议服务器,提供内置防护机制防止AI编码代理执行破坏性数据库操作。

  • by ashwin-acharya01
  • TypeScript
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 ashwin-acharya01/sql-mcp

使用说明

⚠️ 项目未维护和未发布

注意: 此项目不再维护。相应的npm包已从npm注册表中永久取消发布,不再可供下载。


sql-mcp

用于SQL数据库的MCP(模型上下文协议)服务器,内置有防止破坏性操作的护栏。

AI编码代理可以自主执行SQL查询,这意味着它们也可能意外运行 DELETE, DROP,或 UPDATE 在错误的行。 sql-mcp 位于代理和数据库之间,拦截受保护的操作,并在执行之前要求明确确认。

支持的数据库:微软SQL Server、PostgreSQL


安装

⚠️ 包已删除

此包已从npm中删除,不再可用于安装。 此存储库仅供参考。以下命令将不再工作。

# Run directly without installing
npx sql-mcp

# Or install globally
npm install -g sql-mcp
sql-mcp

配置

sql-mcp 完全通过环境变量进行配置——可以在shell中,也可以在MCP客户端的配置中。

必需

变量 描述
DB_TYPE 数据库类型: mssql 或 pgsql
DB_HOST 数据库服务器主机名
DB_NAME 数据库名称
DB_USER 数据库用户名
DB_PASSWORD 数据库密码

可选的

变量 默认值 描述
DB_PORT 5432 (pgsql)/ 1433 (mssql) 数据库端口
GUARD_MODE confirm confirm --保留谨慎的查询以供批准。 block --彻底拒绝他们
GUARDED_OPERATIONS 请参阅下文 逗号分隔的SQL关键字以进行保护。 NONE 禁用防护。 ALL 使用完整的默认列表
DB_TRUST_SERVER_CERTIFICATE false 仅限MSSQL。设为 true 对于具有自签名证书的本地/dev实例

默认保护操作: INSERT, UPDATE, DELETE, DROP, ALTER, TRUNCATE, EXEC, EXECUTE, MERGE, CREATE, GRANT, REVOKE, DENY


MCP客户端设置

克劳德代码/光标/风帆

添加到MCP设置中(例如。 ~/.claude/settings.json 或您客户的同等职位):

PostgreSQL:

{
  "mcpServers": {
    "database": {
      "command": "npx",
      "args": ["sql-mcp"],
      "env": {
        "DB_TYPE": "pgsql",
        "DB_HOST": "localhost",
        "DB_NAME": "mydb",
        "DB_USER": "postgres",
        "DB_PASSWORD": "secret"
      }
    }
  }
}

SQL服务器:

{
  "mcpServers": {
    "database": {
      "command": "npx",
      "args": ["sql-mcp"],
      "env": {
        "DB_TYPE": "mssql",
        "DB_HOST": "localhost",
        "DB_NAME": "mydb",
        "DB_USER": "sa",
        "DB_PASSWORD": "secret",
        "DB_TRUST_SERVER_CERTIFICATE": "true"
      }
    }
  }
}

防护模式

confirm (默认)

当检测到防护操作时, sql-mcp 保存查询并返回一个令牌。代理人必须致电 confirm_query 使用该令牌执行它。这使您有机会在任何运行之前进行审查和批准。

Agent: run_query("DELETE FROM users WHERE inactive = true")
  ← { needs_confirmation: true, token: "uuid", query: "...", expires_in_minutes: 5 }

[You review and approve]

Agent: confirm_query("uuid")
  ← { success: true, rowsAffected: [47] }

令牌在以下时间到期 5分钟。如果令牌过期,请重新运行原始查询以获取新的令牌。

“运行所有内容”/自动批准代理模式的注意事项:如果您的MCP客户端配置为自动执行工具调用,而不会暂停供人查看(例如Cursor的“运行一切”模式),则代理可能会调用 confirm_query 立即之后 run_query 没有任何人工检查点。在这种情况下, confirm 模式不提供真正的保护--使用 block 取而代之的是模式。

block

所有受保护的操作都会立即被拒绝,无法确认。将其用于生产环境或任何代理自主运行而无需人工审查的设置。


工具

list_tables

列出连接数据库中的所有用户表。

退货:每个表的架构名称、表名称、行数、大小(MB)。

{
  "success": true,
  "table_count": 12,
  "tables": [
    { "schema": "public", "table": "users", "full_name": "public.users", "row_count": 15234, "size_mb": 45.2 }
  ]
}

describe_table

返回表的详细架构信息。

参数:

  • tableName --表名,可选模式前缀(例如。 "users" 或 "dbo.users")

退货:列(具有类型、可空性、默认值、PK/标识标志)、外键、索引、行数和示例行。

{
  "success": true,
  "table": "public.users",
  "statistics": { "row_count": 15234 },
  "columns": [
    { "name": "id", "type": "integer", "nullable": false, "default": null, "primary_key": true, "identity": true },
    { "name": "email", "type": "character varying(255)", "nullable": false, "default": null, "primary_key": false, "identity": false }
  ],
  "foreign_keys": [ ... ],
  "indexes": [ ... ],
  "sample_rows": [ ... ]
}

run_query

执行SQL查询。

参数:

  • sql --要运行的SQL查询

安全(无保护)查询立即执行并返回结果。根据配置的查询处理受保护的查询 GUARD_MODE.

结果上限为 1000行如果结果集被截断,则响应包括 "truncated": true.


confirm_query

执行以前保存的受保护查询。

参数:

  • token --由返回的UUID令牌 run_query

仅当令牌存在且未过期(5分钟TTL)时才有效。


analyze_query_impact

在不执行破坏性SQL查询的情况下对其进行分析。返回受影响的行数、将在子表上触发的任何CASCADE关系、警告和建议的估计值。

参数:

  • sql --要分析的SQL查询(DELETE, UPDATE, TRUNCATE,或 DROP)

退货:操作类型、目标表、受影响的估计行、级联详细信息、警告和建议。

{
  "operation": "UPDATE",
  "table": "public.orders",
  "estimated_rows_affected": 3200,
  "cascades": [],
  "warnings": [],
  "recommendations": [
    "Large operation (3,200 rows). Consider batching with LIMIT to reduce lock duration."
  ]
}

给 DELETE, TRUNCATE,以及 DROP,响应还包括 cascades --儿童桌有 ON DELETE CASCADE 外键与目标表的关系。级联行数是最好的努力,可能 null 对于复杂的查询。

备注:In confirm 模式, run_query 当持有受保护的查询时,会自动在其响应中包含影响分析——您不需要调用 analyze_query_impact 单独。


需求

  • Node.js≥18
  • 对数据库的网络访问

许可证

麻省理工学院