Oracle SQLcl MCP 的“受控操作”不是让模型承诺谨慎,而是把连接、能力范围和执行证据分别交给可验证机制。客户端只按名称选择预先保存的连接,不在提示中传递密码;SQLcl MCP 默认以最严格的 Restrict Level 4 启动;数据库会话可用 MODULE 与 ACTION 标记;请求历史还能进入 DBTOOLS$MCP_LOG。这样,开发者与 DBA 能回答模型连了哪个账号、开放了哪些工具、实际执行了什么,以及证据保存在哪里。
这套方式适合本地开发机连接非生产沙箱。Oracle 官方开发者文章明确建议使用最小权限只读用户,并提醒工具目录、默认值和参数会随 SQLcl 版本变化。部署前要以当前安装版本的文档和实际工具列表为准,而不是把示例当成永久接口。
第一层是命名连接。数据库地址、用户和密码保存在本地 SQLcl 连接存储中,MCP 调用只提交连接名称。
第二层是 Restrict Level。SQLcl 进程在 MCP 模式默认使用 Level 4,缩小可用命令与本地系统能力。
第三层是数据库账号。Oracle Database 根据角色、对象权限、过程执行权限和资源策略决定最终可做什么。
第四层是证据。会话标签、动态性能视图和 MCP 活动日志让 DBA 从数据库侧复核,而不是仅相信聊天记录。
提示内容可能进入模型服务、客户端历史、调试日志和团队共享记录。把连接串或密码粘贴给模型,会显著扩大秘密暴露面。
SQLcl MCP 的 connect 工具使用已保存连接名称。模型知道 demo_ro 之类的标识,却不需要读取真实密码。
这并不意味着本地秘密自动安全。非交互连接要求保存密码,本地 SQLcl 存储通常位于用户目录下的 dbtools 位置,需要限制文件权限、磁盘备份和同步范围。
先在非生产 Oracle Database 中建立独立只读用户,只授予演示所需对象的 SELECT。不要使用 DBA、应用所有者或拥有广泛角色的个人账号。
如果需要读取跨 schema 对象,使用明确对象授权或受控视图,不授予 SELECT ANY TABLE。检查 PUBLIC 角色可执行的包与同义词,避免间接扩大权限。
连接账号是最终边界。Restrict Level 限制 SQLcl 命令表面,但 run-sql 中的数据库操作仍由 Oracle 权限判定。
在 SQLcl 中先交互式连接一次,再使用 save 与 savepwd 保存名称和密码。MCP 进程随后可在无人输入密码的情况下连接。
sql /nolog
conn demo_ro@//db-host:1521/service -save demo_ro -savepwd
密码应在终端提示中输入,不写入命令历史。名称应包含环境与用途,例如 sales-sandbox-ro,让操作者能够一眼识别边界。
保存连接的操作系统用户必须与启动 SQLcl MCP 的用户一致,否则 list-connections 可能看不到该条目。
使用 TNS alias 时,MCP 子进程必须能够发现 tnsnames.ora。客户端以自定义环境启动服务时,需要显式传递 TNS_ADMIN。
TNS 配置也属于连接路由边界。别名被修改可能把同一名称指向另一环境,因此文件应受版本与权限控制。
上线前解析并记录实际主机、服务名和 TLS 设置,但日志中不要包含密码。不能只根据 alias 名称推断连接目标正确。
官方示例使用 sql -mcp 启动本地 stdio 服务。MCP 客户端负责启动进程,并通过标准输入输出交换协议消息。
sql -mcp
stdout 必须留给协议通信,诊断内容写到 stderr。包装脚本若向 stdout 打印欢迎语或环境信息,可能破坏 JSON-RPC 通道。
SQLcl MCP 需要受支持版本以及 Java 17 或 21。版本升级前核对工具名称、参数形状和限制默认值。
MCP 模式默认使用 Level 4,这是最严格级别。它限制许多 SQLcl 命令、本地主机交互和脚本能力,适合作为早期试验起点。
不要在客户端配置中加入降低级别的 -R 参数,除非有明确用例、时间范围、审批和补偿控制。尤其要检查是否存在 -R 0,它代表更宽的表面。
普通 SQLcl 非 MCP 模式的默认值可能不同。安全评估必须针对实际启动命令,不因同一二进制而混淆两种模式。
Level 4 主要约束 SQLcl 自身功能,不会自动把高权限数据库用户变成只读用户。run-sql 仍可能提交账号有权执行的 SQL 或 PL/SQL。
如果保存的是应用所有者连接,Agent 可能拥有修改表、执行过程和读取敏感数据的能力。最小权限账号必须与最严格级别同时使用。
限制级别变化应成为审计事件。进程启动参数、版本和有效级别要记录在部署证据中。
客户端先调用 list-connections,确认 demo_ro 可发现。这个动作验证了 MCP 进程与创建连接时使用同一操作系统身份和配置目录。
列表响应不应包含密码、钱包秘密或完整敏感地址。只暴露用户完成选择所需的名称和有限元数据。
连接工具只接受已有名称,不接受模型临时提供的任意连接串,能够避免把 SQLcl MCP 变成开放数据库代理。
Oracle 资料列出的常见工具包括 list-connections、connect、disconnect、run-sql 和 run-sqlcl,部分版本还包含 schema-information。
客户端连接后应实际查看 tools/list 结果,并保存到测试证据。不能根据博客截图推断本机一定拥有或缺少某工具。
工具参数名称在不同客户端封装中也可能表现为 name、connectionName 或 connection_name。以当前 MCP Server schema 为准。
DBMS_APPLICATION_INFO.SET_MODULE 可以给当前数据库会话标记模块与动作。例如模块写 sqlcl-mcp,动作写 schema-discovery。
BEGIN
DBMS_APPLICATION_INFO.SET_MODULE(
module_name => 'sqlcl-mcp',
action_name => 'schema-discovery'
);
END;
标签让 DBA 在性能视图、追踪和审计中识别这次试验。它比依赖客户端聊天标题更接近数据库真实执行。
ACTION 应描述受控任务,不放入用户个人信息、原始提示或秘密。每次任务变化时更新,并在连接结束时清理。
如果完全由模型自由填写 MODULE 与 ACTION,它也可能伪造或省略标签。宿主应根据已认证用户、项目和审批单生成受控值。
数据库侧还可通过登录触发器或连接服务设置基础 MODULE,减少对 Agent 自律的依赖。
标签是关联线索,不是权限凭据。不能因为 ACTION 写着 readonly 就放宽数据库授权。
有权限的 DBA 可以在 V$SESSION 中查询 module、action、username 和 machine,确认当前会话真实存在并带有预期标记。
SELECT module, action, username, machine
FROM v$session
WHERE module = 'sqlcl-mcp';
普通只读用户通常不应直接拥有广泛动态性能视图权限。DBA 可以提供只显示该测试账号的受限视图,或代为执行一次验证。
看不到记录可能是权限或会话已经断开,不应立即推断标记失败。结合会话时间和日志定位。
Oracle 资料称 SQLcl MCP 默认把请求历史记录到 DBTOOLS$MCP_LOG。示例字段包含 MCP 客户端、模型、端点类型、端点名称与日志消息。
表的所有者、schema、访问权限和保留方式可能随环境变化。部署者应与 DBA 确认实际位置,不直接假设当前用户能查询。
日志用于证明服务接收和处理了哪些请求,但仍要核对它是否记录完整 SQL、参数或错误信息,并依据数据分类设置访问和保留周期。
聊天记录表示模型说了什么和客户端展示了什么,不一定证明数据库实际执行。工具调用可能失败、重试、被修改或路由到另一连接。
数据库会话和活动日志位于执行路径内,可以与账号、时间和目标实例关联。二者结合更适合审计。
最完整的证据链包含用户请求标识、MCP 调用标识、连接名称、数据库会话标识、MODULE、ACTION、执行结果和审批记录。
初始测试应查询当前用户拥有的 user_tables,并限制返回行数。确认基本链路后,再考虑访问 ALL_TABLES 中批准 schema。
SELECT table_name
FROM user_tables
ORDER BY table_name
FETCH FIRST 5 ROWS ONLY
不要一开始执行 SELECT * 或扫描大业务表。表名与列名本身也可能敏感,探索范围由数据库授权控制。
查询前记录 ACTION,查询后从数据库侧复核,再断开连接,形成清晰试验边界。
run-sql 向数据库提交 SQL 或 PL/SQL。run-sqlcl 面向 SQLcl 控制命令,如某些描述与格式化能力。
Level 4 下许多 SQLcl 命令不可用,不同构建的简单 DESC 行为也可能不同。早期测试只开放 run-sql,可获得更小攻击面。
若必须使用 run-sqlcl,逐条建立允许命令清单并实际验证,不要把整个控制台能力视为普通只读查询。
匿名 PL/SQL 块可以调用数据库包和过程。即使不包含显眼 DML,过程内部也可能写数据、访问网络、文件或调度任务。
会话标记示例本身使用 DBMS_APPLICATION_INFO,这是受控过程调用。数据库账号只获得所需包的 EXECUTE,不授予通用高权限包。
检查 PUBLIC 默认可执行包与自定义 SECURITY DEFINER 类能力。对可调用过程建立参数、审计和资源边界。
完成任务后调用 disconnect,释放数据库会话并让审计窗口更清晰。长期空闲连接会占用资源,也可能保留会话状态。
客户端异常退出时,服务需要清理连接。数据库配置合理的 idle timeout,并监控残留 sqlcl-mcp 会话。
再次连接前不要假设上一会话的 MODULE、ACTION、角色或 NLS 设置仍然存在,应显式初始化。
非交互 MCP 连接要求保存密码,这是便利性与秘密风险的交换。攻击者若取得开发者账号或备份,可能读取连接存储。
只在沙箱保存低权限、可轮换凭据,限制 dbtools 目录权限,不同步到公共云盘,不打包进支持文件。
生产更适合短期凭据、钱包、外部秘密管理或受治理的远程服务,而不是个人工作站长期保存高权限密码。
SQLcl 25.2 之后提供 MCP 能力,但 25.4、26.1 等版本的工具与默认行为可能演进。固定经过测试的 SQLcl 与 Java 版本。
升级前比较工具 schema、Restrict Level 文档、连接存储格式和日志行为。复跑连接、权限、命令拒绝、会话标记和日志查询测试。
客户端扩展也可能自动管理 SQLcl MCP,必须确认它实际启动的命令与环境,没有静默加入降低限制的参数。
客户端要求输入密码时,检查保存连接是否同时包含 savepwd,以及 MCP 进程是否由同一系统用户启动。
工具缺失或名称不同,先检查 SQLcl 版本和实际 tools/list,不要反复修改数据库权限。
会话标签不可见时,检查动态视图查询权限、会话是否仍在线、MODULE 拼写和 DBA 提供的受限视图。
能力比预期更宽时,立即检查启动参数与有效 Restrict Level,恢复无 -R 覆盖的 Level 4,并审计期间发生的调用。
V$SESSION 和 MCP 日志可能暴露用户名、主机、模型名称、工具端点和 SQL 内容。只有运维与审计角色应访问。
制定保留周期、脱敏和导出规则。证据被修改或删除时应告警,高保证环境把日志发送到独立平台。
会话标签与日志时间使用统一时区,并携带不可重复的请求标识,避免多个并发 Agent 记录混在一起。
第一,使用专用只读沙箱用户保存命名连接,检查本地存储权限和连接实际目标。
第二,以 sql -mcp 启动,不传降低 Restrict Level 的参数,记录版本和工具目录。
第三,列出连接并按名称连接,设置受控 MODULE 与 ACTION,执行限定五行的元数据查询。
第四,由 DBA 在 V$SESSION 与 DBTOOLS$MCP_LOG 复核账号、标签、时间和请求,再调用 disconnect。
第五,尝试未经授权表、写入、危险 PL/SQL 和受限制 SQLcl 命令,确认数据库权限与 Level 4 分别拒绝。
确认只在非生产或批准环境使用,保存连接属于专用最小权限账号,密码存储符合组织秘密政策。
确认 MCP 启动保持 Restrict Level 4,工具目录已按实际版本核验,高风险工具需要客户端审批。
确认 TNS_ADMIN 与别名指向正确目标,连接名称明确表达环境,模型无法提交任意原始凭据。
确认 MODULE 与 ACTION 由可信上下文设置,DBA 能通过受限视图和 MCP 日志验证执行证据。
确认 SQLcl、Java 与客户端版本固定,升级会触发权限、限制级别、工具与审计回归测试。
Oracle SQLcl MCP 的受控操作模型,把秘密留在命名连接存储,把工具边界交给 Restrict Level,把数据权限交给 Oracle 账号,再用会话标签与数据库日志留下证据。真正值得信任的不是模型说自己只做了读取,而是 DBA 能从数据库侧确认连接身份、限制状态和实际执行轨迹。保持 Level 4、只读沙箱和可验证审计,才能让本地 AI 数据库操作逐步获得可控授权。