SQL MCP Server 中的数据操纵语言(DML)工具

重要

SQL MCP Server 以预览版提供,本文档和引擎实现在此评估期间可能会更改。

SQL MCP Server 向 AI 代理公开六种数据作语言(DML)工具。 这些工具为数据库操作提供类型化的 CRUD 接口 - 创建、读取、更新和删除记录以及执行存储过程。 所有工具都遵循基于角色的访问控制(RBAC)、实体权限和配置中定义的策略。

什么是 DML 工具?

DML(数据操作语言)工具处理数据操作:创建、读取、更新和删除记录,以及执行存储过程。 与修改架构的 DDL (数据定义语言)不同,DML 仅在现有表和视图中的数据平面上运行。

六个 DML 工具包括:

  • describe_entities - 发现可用的实体和操作
  • create_record - 插入新行
  • read_records - 查询表和视图
  • update_record - 修改现有行
  • delete_record - 删除行
  • execute_entity - 运行存储过程

全局和实体启用 DML 工具后,SQL MCP Server 会通过 MCP 协议公开它们。 代理永远不会直接与数据库架构交互 - 它们通过数据 API 生成器抽象层工作。

工具

list_tools响应

代理调用 list_tools时,SQL MCP Server 返回:

{
  "tools": [
    { "name": "describe_entities" },
    { "name": "create_record" },
    { "name": "read_records" },
    { "name": "update_record" },
    { "name": "delete_record" },
    { "name": "execute_entity" }
  ]
}

describe_entities

返回当前角色能够使用的实体。 每个条目包括字段名称、数据类型、主键和允许的操作。 此工具不会查询数据库。 而是从配置文件构建的内存配置中读取。

{
  "entities": [
    {
      "name": "Products",
      "description": "Product catalog with pricing and inventory",
      "fields": [
        {
          "name": "ProductId",
          "type": "int",
          "isKey": true,
          "description": "Unique product identifier"
        },
        {
          "name": "ProductName",
          "type": "string",
          "description": "Display name of the product"
        },
        {
          "name": "Price",
          "type": "decimal",
          "description": "Retail price in USD"
        }
      ],
      "operations": [
        "read_records",
        "update_record"
      ]
    }
  ]
}

注释

任何 CRUD 和执行 DML 工具使用的实体选项都直接来自 describe_entities。 附加到每个工具的内部语义说明强制实施这两个步骤流。

创建记录

在表中创建新行。 需要对当前角色的实体创建权限。 该工具根据实体架构验证输入,强制实施字段级权限,应用创建策略,并返回具有任何生成的值的已创建记录。

read_records

查询表或视图。 支持筛选、排序、分页和字段选择。 该工具从结构化参数生成确定性的 SQL,应用读取权限和字段投影,并强制实施行级安全策略。

使用数据 API 生成器的缓存系统对来自 read_records 的结果进行自动缓存。 可以全局或每个实体配置缓存生存时间(TTL),以减少数据库负载。

更新记录

修改现有行。 需要主键和字段才能更新。 该工具验证主键是否存在,执行更新权限和策略,并且仅更新当前角色可以修改的字段。

删除记录

删除现有行。 需要主键。 该工具验证主密钥是否存在、强制实施删除权限和策略,并使用事务支持执行安全删除。

警告

某些生产方案将全局禁用此工具以广泛限制模型。

执行实体

运行存储过程。 支持输入参数和输出结果。 该工具根据过程签名验证输入参数,强制实施执行权限,并安全地传递参数。

运行时配置

的运行时部分中,全局配置 DML 工具。

{
  "runtime": {
    "mcp": {
      "enabled": true,
      "path": "/mcp",
      "dml-tools": {
        "describe-entities": true,
        "create-record": true,
        "read-records": true,
        "update-record": true,
        "delete-record": true,
        "execute-entity": true
      }
    }
  }
}

使用 CLI

使用数据 API 生成器 CLI 单独设置属性:

dab configure --runtime.mcp.enabled true
dab configure --runtime.mcp.path "/mcp"
dab configure --runtime.mcp.dml-tools.describe-entities true
dab configure --runtime.mcp.dml-tools.create-record true
dab configure --runtime.mcp.dml-tools.read-records true
dab configure --runtime.mcp.dml-tools.update-record true
dab configure --runtime.mcp.dml-tools.delete-record true
dab configure --runtime.mcp.dml-tools.execute-entity true

禁用工具

在运行时级别禁用某个工具时,无论实体权限或角色配置如何,它都不会显示给代理。 这个设置在您需要严格的操作边界时非常有用。

常见应用场景

  • 禁用 delete-record 以防止生产中数据丢失
  • 对只读报告端点禁用create-record
  • 在不使用存储过程时禁用execute-entity

全局禁用工具时,该工具会隐藏在响应中 list_tools ,并且无法调用。

实体设置

除非对实体进行明确限制,否则它们会自动参与 MCP。 该 dml-tools 属性存在,因此你可以从 MCP 中排除实体或缩小其功能,但无需设置任何内容即可正常使用。

{
  "entities": {
    "Products": {
      "mcp": {
        "dml-tools": true
      }
    },
    "SensitiveData": {
      "mcp": {
        "dml-tools": false
      }
    }
  }
}

如果未在实体上指定 mcp.dml-tools ,则当 MCP 在全局启用时,true 为默认值。

细粒度控制

您可以针对单个实体禁用特定工具:

{
  "entities": {
    "AuditLogs": {
      "mcp": {
        "dml-tools": {
          "create-record": true,
          "read-records": true,
          "update-record": false,
          "delete-record": false
        }
      }
    }
  }
}

此配置允许代理创建和读取审核日志,但会阻止修改或删除。

RBAC 集成

每个 DML 工具操作都会强制实施基于角色的访问控制规则。 代理的角色决定了哪些实体可见,允许哪些操作,包含哪些字段,以及行级策略是否适用。

如果anonymous角色仅允许对Products只具有读取权限:

  • describe_entities仅在操作中显示read_records
  • create_recordupdate_recorddelete_record 不可用
  • 仅允许 anonymous 在架构中显示的字段

dab-config.json中配置角色

{
  "entities": {
    "Products": {
      "permissions": [
        {
          "role": "anonymous",
          "actions": [
            {
              "action": "read",
              "fields": {
                "include": ["ProductId", "ProductName", "Price"],
                "exclude": ["Cost"]
              }
            }
          ]
        },
        {
          "role": "admin",
          "actions": ["*"]
        }
      ]
    }
  }
}