第一次打开 DataNexa#
DataNexa 是一个运行在你本机的数据库 MCP 网关。它把 SQLite、MySQL、PostgreSQL 以及通过 JDBC 接入的数据库,统一成一份 MCP 服务提供给 AI Agent,并在查询到达数据库之前完成只读校验、资源限制与审计记录。
安装与首次启动
- 从 GitHub Releases 下载对应系统的安装包,安装后启动 DataNexa。安装包不内置 Java 运行时,JDBC 功能会在需要时单独准备。
- 首次打开会进入概览页。此时 MCP 服务尚未启动,连接数为 0,属于正常状态。
- 建议先完成新建数据库连接 → 测试连接 → 启动 MCP 服务 → 接入 Agent 四步。
你的数据存在哪里
| 内容 | 存放位置 | 说明 |
|---|---|---|
| 连接元数据 | 本地 TOML 配置文件 | 名称、类型、主机、端口、数据库、限额等;不含密码。 |
| 数据库密码 | 操作系统凭证库 | macOS 钥匙串、Windows 凭据管理器。 |
| 审计日志 | 本地 SQLite(WAL) | 按保留天数自动清理,可在审计日志页查看。 |
| JDBC 驱动与运行时 | 应用数据目录 | 可在「设置 → 存储与性能」查看占用并打开目录。 |
导出连接文件会把数据库密码写入文件(默认要求设置加密密码)。请只在受控位置保存,迁移完成后及时删除。
六个页面分别做什么#
DataNexa 的左侧导航固定为六项:概览、数据库连接、工具、访问控制、审计日志、设置。日常使用基本沿着这条路径:先在「数据库连接」里准备数据源,再到「概览」启动服务,最后把配置交给 Agent。
顶栏与全局状态
页面右上角的快捷操作随页面变化:在「数据库连接」页可以一键紧急断连,在「审计日志」页可以打开筛选,在「访问控制」页可以快速创建令牌。
侧边栏底部始终显示 MCP 服务的状态:服务运行中 · 端口 或 服务已停止。点击状态可以在概览页查看详情。
主题、语言与动效
- 主题:侧边栏底部的按钮在浅色与深色之间切换;「设置 → 通用 → 显示」还可以选择「跟随系统」。
- 语言:「设置 → 通用 → 显示 → 界面语言」可在简体中文与 English 之间切换,立即生效。
- 动效:「MCP 被调用时显示能量脉冲」默认开启。调用成功与失败会在概览状态卡上留下不同颜色的反馈。
四步接入 Agent#
如果你刚装好 DataNexa,跟着这一章走一遍即可完成最小可用配置。每一步都可以在后续章节找到更细的说明。
新建连接
进入「数据库连接 → 新建连接」,选择数据库类型并填写连接信息。强烈建议使用数据库侧的只读账号;SQLite 需要选择数据库文件。
测试连接
保存后点击「测试连接」,确认网络、凭证与权限都正确。失败时先看错误信息,再用「诊断连接」检查凭证状态与地址。
启动服务
回到「概览」,点击服务状态卡上的「启动」;或在「设置 → 通用 → 服务策略」中确认端口与鉴权配置后启动。服务默认只监听本机。
接入 Agent
点击「复制接入配置」,把生成的内容交给支持 MCP 的客户端;或按第六章的 JSON 示例手动填写。完成后让 Agent 调用一次 list_connections 验证。
完成前的自查清单
- 连接状态为「启用」,而不是「暂停」。
- 服务状态显示「运行中」,并记下端点地址与端口。
- Bearer 鉴权开启时,客户端配置里带有正确的
Authorization头。 - 至少保持
datanexa_list_connections与datanexa_get_schema两个工具开启,便于 Agent 先发现数据结构。 - 在「审计日志」中能看到刚才的调用记录。
添加数据库连接#
这一章说明一条连接怎么建、怎么测、怎么停,以及密码最后落在哪里。做完之后你会得到一条「能连、能查、能停」的只读连接,后面的 MCP 服务与 Agent 才有数据可用。
连接列表与右侧检查器
「数据库连接」页面分两栏:左边是全部连接,右边是当前选中连接的明细。每条记录显示数据库图标、名称、状态标签和一行地址摘要:SQLite 显示数据库文件,MySQL 与 PostgreSQL 显示 host:port,JDBC 显示 JDBC URL。
行内右侧是五个图标按钮,鼠标悬停会显示名称:电源图标切换启用与暂停,线缆图标是「测试连接」,放大镜图标是「诊断连接」且对 JDBC 连接不可用,竖排点图标打开编辑,垃圾桶图标删除。连接被暂停后,测试与诊断都会失效。复制入口只在右侧检查器里:点那里的连接名即复制,并提示「连接名已复制。」。
右侧检查器列出这台连接的全部关键参数:主机、端口、数据库、用户名、SSL 模式、最大返回行数、查询超时(毫秒)、最大连接数、最大结果大小(按 KiB 显示)。SQLite 的主机一栏固定显示 LOCAL;JDBC 连接只显示 JDBC URL,其余地址字段不适用。
新建一条连接
新建和编辑共用同一个弹窗,分为基础信息、连接地址、凭证与限制三段。保存前可以先点「测试连接」,用当前填写的值试连一次,不会先写入配置。
打开弹窗
点页面右上角的「新建连接」。名称默认填入「新的只读连接」,类型默认是 MySQL,主机 localhost,端口 3306,SSL 模式为「优先 / 自动」。
选择数据库类型
可选 SQLite、MySQL、PostgreSQL、JDBC。切换类型会把不适用的字段清空,端口自动改成该类型的默认值,因此类型要最先确定。
填写连接地址
SQLite 只填数据库文件路径;MySQL 与 PostgreSQL 填主机、端口、数据库名;JDBC 则从已安装的驱动 Bundle 里选一个,再填以 jdbc: 开头的 URL。
填写凭证与限额
密码框的占位文字会提示「保存到本机凭证库」,编辑已有连接时改为「留空则保留现有密码」。四项限额都有默认值,可以先不动,之后再按需调小。
测试后保存
点「测试连接」确认能通,提示「连接可用 · 12 ms」这样的消息后,再点「保存连接」。成功会提示「连接配置已保存。」;JDBC 连接在未选驱动时保存按钮不可用。
字段与默认值
下表列出弹窗里的全部字段。标注「必填」的字段留空时保存会被拒绝,并给出对应的错误提示。
| 字段 | 适用类型 | 说明 |
|---|---|---|
| 连接名称必填 | 全部 | 列表、审计日志和 Agent 返回的连接清单里都用这个名字。 |
| 数据库类型 | 全部类型 | 切换类型会重置端口与不适用的地址字段。 |
| 数据库文件必填 | SQLite | 文件的绝对路径,以只读方式打开,不需要用户名和密码。 |
| 主机必填 | MySQL PostgreSQL | 数据库地址;本机可填 localhost 或 127.0.0.1。 |
| 端口必填 | MySQL PostgreSQL | 默认 3306 / 5432,换类型时自动改写。 |
| 数据库必填 | MySQL PostgreSQL | 库名,不是表名。SQLite 与 JDBC 不需要这一项。 |
| 用户名 | MySQL PostgreSQL JDBC | 可留空;建议专建一个只有读权限的账号。 |
| SSL 模式 | MySQL PostgreSQL | 「禁用」「优先 / 自动」「强制」三选一,默认为「优先 / 自动」。 |
| JDBC 驱动必填 | JDBC | 只能从已安装的驱动 Bundle 里选,未安装时下拉框只有占位提示。 |
| JDBC URL必填 | JDBC | 必须以 jdbc: 开头,否则提示 URL 无效。 |
| Driver Class | JDBC | 可选。自动发现失败时才需要手填,占位提示正是「自动发现失败时填写」。 |
| 密码 | MySQL PostgreSQL JDBC | 写入本机凭证库;编辑时留空表示保持不变。 |
四项限额决定单次查询最多能返回多少内容。填超出范围的值会被自动夹到最近的边界,数值换算关系是 1 KiB = 1024 字节。
| 限额 | 默认值 | 允许范围 |
|---|---|---|
| 最大返回行数 | 500 | 1 到 5000 行 |
| 查询超时毫秒 | 8000 | 500 到 60000 毫秒 |
| 最大连接数 | 1 | 1 到 3 条 |
| 最大结果大小 | 1024 KiB | 64 到 8192 KiB,即 64 KiB 到 8 MiB |
密码存在哪里
连接元数据保存在 TOML 配置文件里,密码单独存入本机凭证库。配置文件只保存形如 vault://local_db 的引用,不是密码本身;凭证库就是操作系统的凭证存储,服务名固定为 com.mingo.datanexa。
「凭证与限制」组底部会显示当前状态,例如「当前凭证:vault://local_db。DataNexa 不会把明文密码写入配置文件。」,没有存过密码时显示「尚未保存」。点「清除已保存凭证」会把该连接在凭证库里的条目删掉,之后这条连接必须重新输入密码才能使用。
SELECT,这样即使某一层被绕过,数据库仍然会拒绝写入。「测试连接」与「诊断连接」的区别
两个按钮长得像,做的事情完全不同。「测试连接」会真的连一次数据库:成功时提示「连接可用 · 耗时」,失败时把数据库返回的错误原样带出来。原生连接测试失败后还会附上一段本地诊断信息,方便一起判断。
「诊断连接」不连数据库,只读本地配置与凭证库,然后给出一行摘要:连接名称、类型和凭证状态,必要时再加一条针对性的提示。凭证状态有六种取值——「不需要」(SQLite)、「未保存」、「已保存空密码」、「已保存」、「凭证引用存在,但本机凭证库里找不到密码」、「读取本机凭证库失败」。诊断只在原生连接上可用,JDBC 连接不会显示这个按钮。
紧急断连
连接页顶部有一个三角警告图标的动作,名字是「紧急断连」。它的用途是当你怀疑 Agent 正在做不该做的事时,用一次点击切断所有数据库访问,而不是逐条去关连接。
- 前置条件:MCP 服务必须在运行,服务已停止时按钮是灰的。
- 按下之后:进行中的请求被取消,已打开的原生连接池与 JDBC 会话全部关闭,界面上所有连接操作同时禁用。
- 恢复:同一按钮此时显示为「退出紧急断连」,再点一次即回到正常状态,连接开关回到进入前的样子。
导入与导出
入口在「设置 → 通用 → 导入/导出」,面板里只有两个动作:「导出连接」和「导入连接」。导出前必须二选一:设置加密密码,或者选择不加密导出。
加密导出需要输入两遍「加密密码」,至少 8 个字符,两次不一致会提示「两次输入的加密密码不一致。」。这个密码不会被保存,文件一旦丢失就无法恢复。选择「不加密导出」时会先弹出警告,列出三条风险,并要你勾选「我了解导出文件会以明文保存数据库密码」才允许继续。
导入是追加,不是覆盖:文件里的每条连接都会拿到一个新的内部 ID,与现有连接同名也不会覆盖。个别条目无法导入时会被跳过,提示会写成「已新建 N 个数据库连接,跳过 M 个无法导入的连接。」。加密文件会先要求输入密码,并显示文件的导出时间;密码错误提示「加密密码错误,或文件已损坏。」。单个导入文件上限 5 MB、最多 1000 条连接。
排错
| 现象 | 常见原因 | 处理 |
|---|---|---|
| SQLite 打不开 | 路径写错,或当前用户对该文件没有读权限 | 改成绝对路径,确认文件存在且可读;数据库文件必须已存在,应用不会替你创建。 |
| MySQL 报 Access denied | MySQL 授权区分 user@localhost 与 user@127.0.0.1 | 在主机里把 127.0.0.1 与 localhost 互换再试,诊断连接会给出同样的提示。 |
| 本地库连不上且没有明确报错 | SSL 模式为「强制」,但本地库没有启用 SSL | 编辑连接,把 SSL 模式改为「禁用」。 |
| 提示没有可用密码 | 凭证引用在,但凭证库里找不到对应条目 | 编辑连接,重新输入密码并保存;换过机器或重装过,凭证不会跟着走。 |
| 测试按钮点不动 | 连接处于暂停状态,或审计日志迁移尚未完成 | 先启用连接;迁移未完成时等迁移结束再试。 |
| 保存时被拒绝 | 名称、数据库名或主机为空 | 补全必填字段;JDBC 连接还要确认已选驱动且 URL 以 jdbc: 开头。 |
仍然连不上时,先点「诊断连接」确认凭证状态,再看「审计日志」里有没有对应的失败记录。开启调试日志后,连接测试失败的原因也会写进日志文件。
通过 JDBC 连接其他数据库#
SQLite、MySQL、PostgreSQL 之外,DataNexa 可以借 JDBC 驱动连到更多数据库。这一章讲清楚三件事的先后关系——Java 运行时、驱动 Bundle、连接,以及这项能力在哪里会失效。
JDBC 支持的范围与限制
原生连接只覆盖三种数据库,且每种都做了针对性适配。其他数据库(例如各类国产库、ClickHouse、Hive、Oracle 等)没有一个统一的协议,只能借 JDBC 驱动去连。设置页把这一项标成「JDBC 支持」,标签上带一个「预览」角标,意思是功能可用但还在演进。
代价是 DataNexa 无法替每个驱动、每个数据库版本、每种 SQL 方言做验证。设置页底部常驻两段说明:一段是「无论驱动原生能力如何,DataNexa 的只读保护与超时兜底始终生效」,另一段是风险摘要,点「查看详情」可以看到完整清单。风险归成四类:兼容性、方言、资源、驱动本身。
JDBC 路径能做的
- 执行经过策略引擎校验的受控只读查询。
- 读取表与视图清单、表结构、采样行。
- 沿用同一套行数、大小、超时与审计限制。
它做不到的
- 无法保证识别所有写入操作或其他副作用。
- 数据库特有的语法、函数、Hint 可能解析失败而被拒。
- 部分数据库特定的能力在 JDBC 路径下不可用。
第一步:Java 运行时
JDBC 驱动是一段 Java 代码,必须有一个 Java 运行时来跑。入口在「设置 → JDBC 支持」,页面最上方是「Java 运行时」卡片,显示可用或不可用、Java 版本、以及来源。
- 来源有两种:「DataNexa Java 运行时」(由应用下载托管)和「外部 Java 运行时」(你指定的
JAVA_HOME)。 - 下载:运行时不可用时卡片上出现「下载 DataNexa Java 运行时」,过程依次显示准备、下载、校验、解压、安装五个阶段。
- 更新:托管运行时可以点「检查 Java 运行时更新」,有新版本时按钮变成「更新到 {版本}」。
- 换成外部运行时:文件夹图标是「选择外部 Java 运行时」;选过之后出现「使用 DataNexa Java 运行时」用来切回。
- 卸载:托管运行时存在时才有垃圾桶按钮,确认后删除;外部运行时不受影响,JDBC 会话运行期间不允许卸载。
第二步:安装驱动 Bundle
驱动卡片上有两个动作:「安装驱动」从 Maven 仓库拉取,「导入本地驱动」直接选本地 JAR 或目录。两者都要求 Java 运行时可用,否则按钮是灰的。安装完成后生成一个 Bundle:目录里是 JAR 与一份清单,清单记录每个 JAR 的大小与 SHA-256,每次使用前都会校验,文件被改动或缺失会直接报「驱动 Bundle 不完整或已损坏」。清单里另有一块能力探测结果,见下一节。
从 Maven 安装时需要填「显示名称」和「Maven 坐标」,坐标格式是 groupId:artifactId:version,例如 org.postgresql:postgresql:42.7.4。「Maven 镜像源」可选 Maven Central、Aliyun、Huawei Cloud、Tencent Cloud,或选「自定义仓库」后填自己的 HTTPS 地址。过程中依次显示:准备安装、下载运行时依赖、校验文件完整性、检测 JDBC Driver、创建驱动 Bundle。
导入本地驱动时填「显示名称」,再用「选择 JAR 文件」挑文件;也可以直接在路径框里写多条路径,用分号分隔,路径可以是 JAR 也可以是包含 JAR 的目录。安装时要能从 JAR 里找到至少一个 JDBC Driver 实现,否则会失败;成功后被发现的类就记在 Bundle 里,新建连接时不必再填。
能力标识什么时候出现
每行驱动下方有「驱动原生支持」一栏,后面跟两枚标识:「只读限制」和「超时限制」。对勾表示驱动接受 setReadOnly 或 setQueryTimeout,叉号表示驱动拒绝,未探测时显示「测试连接后检测」。
探测不是安装时做的,而是在真正用到驱动的时候:在连接页对这条 JDBC 连接执行一次「测试连接」,或者让 Agent 发起一次查询。结果写回 Bundle 清单里的能力字段,之后一直显示,不需要重复探测(只改写这一块,JAR 文件本身不动,SHA-256 校验也就不会失效)。驱动拒绝某项能力只会让查询继续跑,不会让查询失败,这也是为什么「叉号」不等于「不能用」。
第三步:新建 JDBC 连接
在「数据库连接」页新建连接,类型选 JDBC,地址区域会变成四个字段。底部会提示一句:JDBC 技术预览支持通过 MCP 执行受控只读查询,未知方言或无法确认安全的语句会被拒绝。
| 字段 | 必填 | 说明 |
|---|---|---|
| JDBC URL | 是 | 必须以 jdbc: 开头。主机、端口、库名、时区、字符集等参数全部写在这条 URL 里。 |
| JDBC 驱动 | 是 | 从已安装的 Bundle 中选。没装驱动时下拉框只有占位文字,保存按钮不可用。 |
| 用户名 | 否 | 部分驱动允许写在 URL 里,此时这里可以留空。 |
| Driver Class | 否 | 通常留空,用 Bundle 里自动发现的类;自动发现失败时才手填完整类名。 |
| 密码 | 否 | 与原生连接一样存进本机凭证库,配置文件里只留引用。 |
与原生连接相比,JDBC 连接少了主机、端口、数据库、SSL 模式四项——这些都在 URL 里——也少了「诊断连接」这个按钮,因为诊断依赖原生驱动才会有的本地信息。限额、启用状态、测试连接、审计记录的行为与原生连接一致。
只读与超时是怎么兜底的
JDBC 路径没有方言专用的解析器,用的是通用 SQL 解析。策略引擎会先尝试解析这条语句:解析不了就拒绝,能解析但不是单条语句也拒绝,解析出来又不是只读形态(DDL、DML、带副作用的函数等)同样拒绝。也就是说,宽松的方向不可选,只会在「能确认安全」时才放行。
行数上限在 JDBC 路径下不是通过改写 SQL 加的 LIMIT,而是在读取结果集时逐行计数,达到上限就停止并标记为「截断」;结果大小超限时同样截断。查询本身可能已经在数据库侧执行完,行数限制并不会减少数据库的负载。
超时是双份的:DataNexa 侧给整次操作设一个上限,驱动侧再尝试设置语句级超时。驱动不支持语句超时(例如某些只读文件型驱动)时,第一条仍然生效,只是粒度更粗。
排错
| 现象 | 常见原因 | 处理 |
|---|---|---|
| 「安装驱动」「导入本地驱动」点不动 | Java 运行时不可用 | 先把运行时卡片上的状态变成可用:下载托管运行时,或选一个外部运行时。 |
| Maven 坐标被拒 | 不是 groupId:artifactId:version 三段式 | 补齐三段并确认版本号存在;自定义仓库必须是 HTTPS 地址(本机地址除外)。 |
| 安装时下载失败 | 网络访问不到仓库,或镜像缺少该构件 | 换一个镜像源再试;内网环境可改用本地导入。下载的 JAR 会逐个校验,校验不过会被拒绝。 |
| 导入时报「未提供任何 JDBC Driver 实现」 | 选中的 JAR 里没有 Driver 实现,通常是依赖 JAR 没一起导入 | 把驱动主 JAR 与它依赖的 JAR 一并选中,或放进同一目录后再导入。 |
| 测试连接报找不到驱动类 | URL 与驱动不匹配,或多驱动共存导致选错 | 确认 URL 的协议段与驱动对应;仍失败时在连接里手填 Driver Class。 |
| 能连上但 SQL 一直被拒 | 通用解析器不认识这种方言语法 | 改用通用 SQL 重写查询;确实需要方言特性时,只能接受这条限制。 |
| 时间或中文显示异常 | 时区与字符集参数没写在 URL 里 | 在 JDBC URL 里显式补上 serverTimezone、characterEncoding 这类驱动参数。 |
| 驱动删不掉 | 还有已保存的 JDBC 连接在引用它 | 先删除或改用其他驱动的连接,再删除该驱动。 |
JDBC 的失败原因通常只出现在提示条和调试日志里。开启调试日志后,驱动解析、超时、JDBC 辅助进程(sidecar)意外退出等问题都会留下记录,反馈问题时一并附上。
启动 MCP 服务并接入 Agent#
这一章说明 MCP 服务怎么启动、端点长什么样、鉴权如何开启,以及「复制接入配置」到底生成了什么。照着走一遍,你的 Agent 就能通过本机地址访问已启用的只读连接。
/mcp 端点接收 JSON-RPC 请求;默认要求 Bearer 密钥,复制的接入配置是一份通用的 MCP 客户端配置。服务生命周期
入口在概览页顶部的状态卡。按钮在「启动服务」与「停止服务」之间切换,同一张卡片上还显示已启用的连接数、已启用的工具数和近 24 小时调用次数。侧边栏底部始终显示服务状态与端口,任何页面都能看到。
关闭窗口不会停止服务:窗口会被隐藏到托盘,MCP 服务继续在后台响应请求。只有从托盘菜单选择退出,进程才会真正结束。
启动或停止
在概览页点击状态卡按钮,或点侧边栏底部状态旁的按钮。两处调用的是同一个操作,任选其一。
确认状态
正常时显示「运行中」。启动失败会显示「启动失败」,把鼠标停在状态卡上可以看到失败原因;每次启动失败也会写入一条审计记录。
让它在后台待命
关闭窗口后服务继续运行。开启轻量模式时,窗口关闭 5 分钟后界面资源会被释放,服务不受影响;从托盘重新打开应用即可回到界面。
监听地址与端点
端点由监听地址、端口和固定路径 /mcp 组成。默认是 http://127.0.0.1:17321/mcp;监听地址和端口在「设置 → 通用 → MCP 服务策略」中修改,服务运行中修改会重启监听,绑定失败会自动回滚到原设置。
| 项 | 默认值 | 说明 |
|---|---|---|
| 监听地址 | 127.0.0.1 | 只接受 127.0.0.1 或 localhost,填局域网 IP 会被拒绝。 |
| 端口 | 17321 | 可改为 1–65535;被占用时启动失败,原因可在状态卡与审计中看到。 |
| 端点路径 | /mcp | 唯一路径,只有 POST 可用(GET 返回 405),请求体是 JSON-RPC 2.0。 |
| 传输方式 | Streamable HTTP | 不提供 GET 流式响应;对 /mcp 发 GET 会返回 405。 |
| 协议版本 | 最新版 | 客户端在初始化时协商;接受 2025-03-26、2025-06-18 与 2025-11-25,其他值返回 400。请求不带版本头时,按 2025-03-26 的传输方式兼容处理。 |
Content-Type: application/json,并且 Accept 同时包含 application/json 与 text/event-stream,否则会分别得到 415 与 406。如果你的客户端只能走旧的 SSE 长连接,它无法连上这个端点。Bearer 鉴权
「要求 Bearer 密钥」默认开启,开关在「设置 → 通用 → MCP 服务策略 → 访问控制」。每个请求都要带 Authorization: Bearer <token>,密钥来自「访问控制」里创建的访问令牌;令牌同时决定这次连接能看到哪些数据库和工具。
关闭开关会先弹出确认框,说明失去密钥保护后的影响。确认后立即生效,不需要重启服务。
| 请求头 | 要求 | 不满足时 |
|---|---|---|
Host | 必须是 127.0.0.1 或 localhost | 403,Host is not allowed |
Origin | 可省略;发送时主机必须是本机 | 403,Origin is not allowed |
Authorization | 开启 Bearer 时必填,且令牌处于启用状态 | 401,Missing or invalid bearer token |
Content-Type | application/json | 415,Unsupported Media Type |
Accept | 同时包含 application/json 与 text/event-stream | 406,Not Acceptable |
复制接入配置
在「概览 → 快速开始 → 接入 Agent」卡片上点「复制接入配置」。复制到剪贴板的内容由三段组成:一句说明、一行配置引导,以及下面这份 JSON。粘贴给 Agent,它就能据此写入你所用客户端的配置。
生成的 JSON 结构固定为 mcpServers.datanexa:transport 写 streamable-http,url 是当前端点,开启 Bearer 时再带上 headers.Authorization。它是一份通用配置,不针对某个客户端做字段转换。
{
"mcpServers": {
"datanexa": {
"transport": "streamable-http",
"url": "http://127.0.0.1:17321/mcp",
"headers": {
"Authorization": "Bearer PASTE_YOUR_TOKEN_HERE"
}
}
}
}
- 关闭 Bearer 时:直接复制,JSON 里没有
headers字段。 - 只有一个启用的令牌时:直接复制,密钥已写入
Authorization。 - 有多个启用的令牌时:先弹出「选择访问令牌」,选中后才复制,避免把别的 Agent 的密钥交出去。
- 一个启用的令牌都没有时:不会复制任何内容,而是跳到「访问控制」页,先创建一个令牌。
command 与 args,因为服务是一个 HTTP 端点而不是本地进程。手动抄写时不要漏掉 /mcp,也不要把 127.0.0.1 换成局域网地址或 ::1。若客户端不识别 transport 字段,按该客户端文档确认远程 MCP 的写法,但 url 与 Authorization 的值保持不变。首次验证
配置写入客户端后,不要急着让它查业务数据,先按下面的顺序验证:
- 让 Agent 调用
datanexa_list_connections。返回的是已启用的连接清单,不含密码;看不到某个连接,说明它被暂停或该令牌无权访问。 - 再调用
datanexa_get_schema查看表与视图,确认 Agent 看到的结构范围符合预期。 - 回到「审计日志」,确认刚才两次调用都有记录,并核对工具名、连接与状态。
开机自启动与后台策略
三项开关都在「设置 → 通用 → 启动与后台」,它们决定开机后服务能否自动恢复:
| 开关 | 作用 |
|---|---|
| 「登录时启动 DataNexa」 | 登录时启动 DataNexa。开启后 MCP 服务会随应用一起启动,「启动 DataNexa 时自动开启 MCP 服务」会被锁定为开启。 |
| 「启动 DataNexa 时自动开启 MCP 服务」 | 应用启动且审计存储就绪后自动启动服务。开机自启动开启时该项不可单独关闭。 |
| 轻量模式 | 窗口关闭 5 分钟后释放界面资源以减少占用;服务与托管进程继续运行,重新打开窗口即可恢复。 |
| 托盘状态 | 托盘图标与菜单同步服务状态,可直接启动或停止服务、切换轻量模式、退出应用。 |
排错
| 现象 | 原因 | 处理 |
|---|---|---|
| 启动按钮不可点 | 审计日志迁移尚未完成 | 侧栏会出现迁移提示,等它完成或按提示重试;迁移完成前工具调用无法留痕,所以不允许启动。 |
| 启动失败 | 端口被其他进程占用,或监听地址不合规 | 换一个端口;失败原因可在状态卡悬停查看,也记录在审计日志里。 |
401,Unauthorized | 没带密钥、密钥已轮换,或令牌被停用、删除 | 重新「复制接入配置」;在访问控制确认令牌状态为启用。 |
403,Host is not allowed | 用了局域网 IP、::1 或经由代理访问 | 把 url 改为 http://127.0.0.1:<port>/mcp 或 localhost。 |
| 405 / 406 / 415 | 用 GET 访问,或请求头不满足要求 | 改成 POST;补齐 Content-Type 与 Accept,见上面的请求头表。 |
| 客户端不识别配置 | 生成的是通用 HTTP 配置,不是某客户端专属格式 | 按客户端文档确认远程 MCP 的字段写法,保留 url 与 Authorization 的值。 |
创建和管理访问令牌#
访问控制把同一个本地服务的权限拆成多个命名令牌:每个 Agent 用自己的密钥,只能看到被允许的连接与工具。这一章讲清楚令牌怎么建、密钥什么时候失效,以及熔断之后怎么恢复。
前提:先开启 Bearer
访问控制依赖 Bearer 鉴权。开启 Bearer 时,请求先由密钥识别出令牌身份,再按令牌的权限过滤数据库和工具;关闭 Bearer 时,请求没有身份,令牌也就无从约束。
如果 Bearer 是关闭的,打开「访问控制」只会看到一块提示,而不是令牌列表。点提示里的「开启 Bearer 密钥」即可,它会同时改写服务配置。
令牌列表与操作
访问控制页分左右两栏:左侧列表显示名称、启用状态、短 ID 与最近使用时间,右侧面板显示创建时间、权限与接入入口。行内四个按钮分别对应停用/启用、重命名、轮换与删除,危险操作都会先弹确认框。
| 操作 | 作用 | 注意 |
|---|---|---|
| 启用 / 停用 | 切换令牌是否可用,密钥与权限保持不变。 | 停用后该密钥立即失效,请求返回 401。 |
| 重命名 | 只改显示名称,用于区分请求来源。 | 审计日志按令牌 ID 关联,历史记录也会显示新名称。 |
| 轮换密钥 | 生成新密钥并写入剪贴板。 | 旧密钥在同一刻失效,正在使用它的 Agent 需要更新配置。 |
| 删除 | 令牌立即失效,权限记录一并清除。 | 删除不可恢复;历史审计仍保留名称并标注「已删除」。 |
| 复制 Agent Prompt | 取回密钥并生成完整接入配置。 | 令牌停用时按钮不可用;这是界面里唯一能重新拿到密钥的入口。 |
创建令牌
入口在「访问控制」页顶部右侧的「创建令牌」按钮。创建过程只有一步:给令牌起一个能区分用途的名字。
- 起名时写清使用者和用途,例如「笔记本 Cursor」「报表 Agent」。名称长度 1–80 个字符,之后还能改。
- 确认后令牌立即创建,新密钥同时写入剪贴板,界面不会回显明文。
- 在右侧权限面板按需关闭数据库与工具。新令牌默认允许所有「全局已启用」的连接和工具。
- 点权限面板上方的「复制 Agent Prompt」,把带密钥的完整配置交给这个 Agent。
权限粒度
权限分两栏:数据库权限控制这个令牌能看到、能查哪些连接;工具权限控制它能调用哪些 MCP 工具。两栏都显示「已允许 / 全局已启用」的数量。
关闭某个连接后,它不会再出现在该令牌的 datanexa_list_connections 结果里;即使 Agent 拿着连接 ID 直接调用,也会被拒绝并记录为拦截。关闭某个工具后,它不会出现在 tools/list 中,直接调用同样会被拒绝。
| 权限 | 默认 | 说明 |
|---|---|---|
| 数据库 | 全部允许 | 只对启用中的连接生效;关闭后该连接对这个令牌不可见、不可查。 |
| 工具 | 全部允许 | 只对启用中的工具生效;关闭后该工具不出现、也不能被调用。 |
| 全局开关 | 优先 | 连接或工具已在全局关闭时,令牌侧开关会被禁用并标注「已在全局关闭」,无法单独打开。 |
密钥、轮换与失效
密钥不在页面上回显。创建或轮换后,新密钥会直接写入系统剪贴板;之后需要重新获取时,用该令牌的「复制 Agent Prompt」,它会取出密钥并拼成完整配置,同样只进剪贴板。
所以「密钥只给你一次」并不准确:只要你还能复制 Prompt,就还能拿到密钥。真正的控制手段是停用、轮换与删除——三者都立即生效,不需要重启服务。
| 令牌状态 | 密钥是否有效 | 请求结果 |
|---|---|---|
| 启用 | 当前密钥有效 | 正常鉴权,按令牌权限过滤。 |
| 停用 | 全部失效 | 401,直到重新启用。 |
| 已轮换 | 旧密钥失效,新密钥有效 | 仍用旧密钥的请求返回 401。 |
| 已删除 | 全部失效且不可恢复 | 401;需要重新创建令牌。 |
自动熔断
自动熔断在「设置 → 安全 → 访问令牌自动熔断」。它统计单个令牌在窗口内的拦截次数,达到阈值就自动停用该令牌,避免一个配置错误的 Agent 反复越权。
开关默认关闭,且必须先开启 Bearer 才能打开;窗口与阈值也只在熔断开启后可调。
| 设置项 | 默认 | 可调范围 |
|---|---|---|
| 自动熔断 | 关闭 | 开启 / 关闭,需要 Bearer 已开启。 |
| 统计窗口 | 10 分钟 | 1、5、10、30、60 分钟。 |
| 拦截阈值 | 5 次 | 3、5、10、20、50 次。 |
触发时发生的事情是确定的:
- 窗口内该令牌的拦截记录数达到阈值,熔断器立即把令牌置为停用。
- 写入一条审计记录,工具名为「自动熔断」,状态为拦截,原因里写明窗口、次数与阈值。
- 该令牌之后的所有请求返回 401,直到你手动重新启用。
- 重新启用后计数从头开始,窗口内早于上次熔断的拦截不再累计。
审计里怎么认出令牌
审计记录按令牌归属,列表与详情显示「名称(短 ID)」,短 ID 是令牌 UUID 去掉连接符后的前 8 位。筛选项里也能直接按令牌过滤。
- 没有令牌身份的记录:用来源标注区分——「系统」表示应用自身的动作,「未鉴权请求」表示 Bearer 关闭期间进来的调用,「旧版请求」表示历史遗留数据。
- 已删除的令牌:名称后追加「已删除」,用于把历史记录与现存令牌区分开。
- 熔断事件:工具列显示「自动熔断」,状态为拦截,可作为这条令牌的出问题起点。
最佳实践
- 一个 Agent 一个令牌。便于单独停用与追责,也能在审计里一眼看出是谁在查。
- 从最小权限开始。只留这个 Agent 真正需要的连接与工具;不确定时先关掉
datanexa_execute_readonly_sql,用结构发现类工具跑通流程。 - 定期轮换。把轮换当作换密码:怀疑泄露时立刻轮换,而不是只停用再启用。
- 换机或离职即处理。对应令牌直接删除;需要留档时先导出审计,再删。
- 不要把同一个令牌发给多个 Agent。共享密钥会让审计失去区分度,也无法单独收回某一方的权限。
排错
| 现象 | 原因 | 处理 |
|---|---|---|
| 页面只有一块提示 | Bearer 未开启 | 点「开启 Bearer 密钥」,或到「设置 → 通用 → MCP 服务策略」打开开关。 |
| Agent 一直 401 | 令牌被停用、密钥已轮换,或客户端仍用旧配置 | 确认状态为启用,重新复制 Agent Prompt 并替换客户端里的密钥。 |
| 权限开关是灰的 | 该连接或工具在全局已关闭 | 先在「数据库连接」或「工具」页启用,再回到令牌里分配。 |
| 改了权限仍被拒 | Agent 缓存的工具列表未刷新,或另有策略层拒绝 | 让 Agent 重新拉取工具列表;若工具已出现,去审计看拒绝原因属于权限还是只读策略。 |
| 熔断后一直 401 | 令牌处于自动停用状态 | 先按审计里的原因修权限,再在访问控制重新启用。 |
| 找不到密钥 | 界面不回显明文 | 用「复制 Agent Prompt」重新取回;令牌已删除时只能新建。 |
七个工具的参数与用法#
Agent 能做什么,取决于你开放了哪些工具。这一章逐个说明七个工具的用途、参数、返回和限制,以及只读策略在它们背后如何生效。
工具总表
七个工具分为三组,与「工具」页上的分组一致。关闭任意一个工具,Agent 的 tools/list 里就不会再出现它。
| 工具 | 分组 | 作用 | 读取业务数据 |
|---|---|---|---|
datanexa_list_connections列出连接 | 结构发现 | 返回当前启用且被授权的连接清单,不包含密码与完整 DSN。 | 否 |
datanexa_get_schema读取 Schema | 结构发现 | 列出指定连接下的表与视图,让 Agent 先了解结构边界。 | 否 |
datanexa_describe_table描述表结构 | 结构发现 | 读取单张表的列名、类型、可空与主键信息。 | 否 |
datanexa_sample_rows采样行 | 数据访问 | 从指定表读取少量样本行,用于快速判断数据长什么样。 | 是 |
datanexa_execute_readonly_sql执行只读 SQL | 数据访问 | 执行一条经过策略校验的只读查询,能力最强,也最需要谨慎开放。 | 是 |
datanexa_explain_sql解释 SQL | 分析与策略 | 返回查询计划,帮助 Agent 分析 SQL,而不是读取业务数据。 | 否 |
datanexa_policy_check策略检查 | 分析与策略 | 只做静态策略预检,不连接数据库;适合在真正执行前验证一条 SQL。 | 否 |
结构发现:先看清有什么
三个工具都不读业务行,只读元数据。建议在提示词里要求 Agent 先调用它们,再决定查哪张表。
返回当前启用且被授权的连接清单,不包含密码与完整 DSN。
这个工具不接收参数。
返回:包含 connections 数组;每项有 id、name、type、enabled、三项限额,以及描述该连接支持哪些工具的 capabilities。
列出指定连接下的表与视图,让 Agent 先了解结构边界。
| 参数 | 必填 | 说明 |
|---|---|---|
connection_id | 必填 | 连接 ID,来自 datanexa_list_connections 返回的 id。 |
返回:包含 schema 数组;每项有 name、table_type,部分数据库还会带 schema 名。
读取单张表的列名、类型、可空与主键信息。
| 参数 | 必填 | 说明 |
|---|---|---|
connection_id | 必填 | 连接 ID,来自 datanexa_list_connections 返回的 id。 |
table | 必填 | 表名,按结构化参数处理,不会拼接进 SQL。 |
schema | 可选 | schema 或数据库名;SQLite 通常不需要。 |
返回:包含 columns 数组;每项有 name、data_type、nullable、primary_key。
数据访问:读样本与执行查询
这两个工具会真正读到业务数据。是否开放、开放给哪个令牌,需要单独决定。
从指定表读取少量样本行,用于快速判断数据长什么样。
| 参数 | 必填 | 说明 |
|---|---|---|
connection_id | 必填 | 连接 ID,来自 datanexa_list_connections 返回的 id。 |
table | 必填 | 表名,按结构化参数处理,不会拼接进 SQL。 |
schema | 可选 | schema 或数据库名;SQLite 通常不需要。 |
limit | 可选 | 返回行数上限,1–5000,默认跟随连接的最大返回行数。 |
返回:与只读查询相同的结果对象:列、行、row_count、truncated、returned_bytes、elapsed_ms 与实际执行的 rewritten_sql。
通过 JDBC 接入的连接不支持这个工具,调用会返回 unsupported 说明,而不是假装成功。
执行一条经过策略校验的只读查询,能力最强,也最需要谨慎开放。
| 参数 | 必填 | 说明 |
|---|---|---|
connection_id | 必填 | 连接 ID,来自 datanexa_list_connections 返回的 id。 |
sql | 必填 | 单条只读 SQL,按连接对应的方言解析与校验。 |
返回 policy 与 result:策略放行时,result 是查询结果;策略拒绝时,result 为 null,原因写在 policy.reason 里。
注意:被策略拒绝时,MCP 调用本身仍是成功的(isError 为 false),Agent 必须读取 policy.allowed 才能知道语句没有执行。
一次只读查询的请求
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "datanexa_execute_readonly_sql",
"arguments": {
"connection_id": "demo-mysql",
"sql": "SELECT id, total FROM orders ORDER BY created_at DESC LIMIT 5"
}
}
}
返回的 structuredContent(content 里是同一份 JSON 文本,此处省略)。策略引擎会把最外层行数收紧到 max_rows + 1,用一行额外数据判断是否被截断:
{
"policy": {
"allowed": true,
"reason": "只读 SQL 策略已允许该语句。",
"rewritten_sql": "SELECT id, total FROM orders ORDER BY created_at DESC LIMIT 6"
},
"result": {
"columns": ["id", "total"],
"rows": [
{ "id": 42, "total": 128.5 },
{ "id": 41, "total": 76.0 }
],
"row_count": 2,
"truncated": false,
"returned_bytes": 63,
"elapsed_ms": 12,
"rewritten_sql": "SELECT id, total FROM orders ORDER BY created_at DESC LIMIT 6"
}
}
一次被拒绝的写操作
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "datanexa_execute_readonly_sql",
"arguments": {
"connection_id": "demo-mysql",
"sql": "DELETE FROM orders WHERE id = 42"
}
}
}
{
"policy": {
"allowed": false,
"reason": "只读策略已阻止 DDL、DML、破坏性语句和可能产生副作用的 SQL。",
"rewritten_sql": null
},
"result": null
}
分析与策略:不读业务数据
这两个工具适合在开放查询能力之前先给 Agent 用:一个看执行计划,一个只做静态预检。
返回查询计划,帮助 Agent 分析 SQL,而不是读取业务数据。
| 参数 | 必填 | 说明 |
|---|---|---|
connection_id | 必填 | 连接 ID,来自 datanexa_list_connections 返回的 id。 |
sql | 必填 | 单条只读 SQL,按连接对应的方言解析与校验。 |
返回同样的 policy / result 结构,result 中是执行计划而不是业务行。只接受 EXPLAIN,带 ANALYZE 的写法会被拒绝。
JDBC 连接不支持解释查询,会返回 unsupported 说明。
只做静态策略预检,不连接数据库;适合在真正执行前验证一条 SQL。
| 参数 | 必填 | 说明 |
|---|---|---|
sql | 必填 | 单条只读 SQL,按连接对应的方言解析与校验。 |
connection_id | 可选 | 提供后沿用该连接的方言与行数上限;与 kind 二选一。 |
kind | 可选 | SQL 方言:sqlite、mysql 或 postgres。 |
max_rows | 可选 | 预检使用的行数上限,1–5000,默认 500。 |
返回 policy:allowed、reason,以及会被实际执行的 rewritten_sql。
这个工具不会连接数据库,但同样会留下一条审计记录;用它可以放心地试错,不会碰到真实数据。
只读策略会拦下什么
凡是让 Agent 自己写 SQL 的入口,都走同一套策略引擎:执行只读查询、解释 SQL,以及在执行前做静态预检。引擎先按方言把语句解析成语法树,再逐条检查,判断依据是语句结构而不是字符串匹配,所以注释或字符串字面量里出现的关键词不会造成误判。用结构化参数传表名的工具不经过这套解析,它们只拼出一条固定的 SELECT,并按标识符白名单校验表名。
允许
- 单条
SELECT,包括聚合、排序、分组与子查询。 - 安全的
WITH ... SELECT(CTE 内部不能出现写操作)。 EXPLAIN查询计划,且不带ANALYZE。- 带
LIMIT的查询;策略会校验并收紧最外层行数。
拒绝
INSERT、UPDATE、DELETE、MERGE与任何 DDL。- 一次提交多条语句,或
SELECT INTO写入新表。 - 加锁读取,例如
FOR UPDATE与FOR SHARE。 - 可能产生副作用的函数,例如
sleep、load_file、pg_read_file。 EXPLAIN ANALYZE:它会真正执行语句。- 解析失败或方言不明确的语句,策略宁可拒绝。
放行之后还有三层限制:最外层行数会被收紧到 max_rows + 1,多取的一行只用于判断是否截断;结果超过连接允许的字节数时同样标记 truncated,并可能返回被截断的单元格;查询超过时限会中止并记为「超时」。这些都在结果对象里如实反映,Agent 不应该拿截断结果推断总量。
工具开关、令牌权限与 JDBC 差异
工具开关是全局的:关闭后,tools/list 不再返回该工具,直接调用会收到「工具已关闭」的错误。它适合长期限制 Agent 能做什么。
如果开了 Bearer 鉴权,还可以在「访问控制」里为每个令牌单独勾选数据库与工具。令牌没被授权的工具,调用会返回「未授权给该访问令牌」,与全局关闭的报错不同,便于在审计里区分。
JDBC 连接的能力取决于驱动:datanexa_list_connections 返回的 capabilities 会列出该连接支持与不支持的工具。不要假设所有连接都能采样行或解释查询。
实践建议:始终保留 datanexa_list_connections 与 datanexa_get_schema;datanexa_sample_rows 按需开放;datanexa_execute_readonly_sql 只给确实需要自由查询的 Agent,并配合最小权限令牌。
查看审计日志#
把数据库交给 Agent 之后,最想知道的是它到底做了什么。审计日志按时间记录每一次工具调用:谁发起的、查了哪个库、执行了什么 SQL、结果如何。
记录了什么
每次工具调用都会写入本地 SQLite,包括成功、被策略拒绝、超时、结果被截断与执行出错。服务启动等系统动作也会记录,来源显示为「系统」。审计写入失败会直接让调用失败,不会出现「执行了但没有记录」的情况。
一条记录包含:时间、令牌、工具、连接、状态、原因、耗时、返回行数与 SQL 文本。SQL 会保存实际执行的版本(策略改写后的 SQL),因此你能看到行数限制是怎么加上去的。
| 状态 | 含义 |
|---|---|
| 允许 | 策略放行,查询成功返回。 |
| 截断 | 查询成功,但结果超过行数或字节上限,返回的是不完整数据。 |
| 拒绝 | 被只读策略、令牌权限或自动熔断拦下,语句没有执行。 |
| 超时 | 超过连接的查询时限,连接被丢弃。 |
| 错误 | 连接、SQL、驱动或数据库返回错误,原因里保留原始信息。 |
列表与筛选
列表按时间倒序展示「时间、令牌、工具、连接、状态、详情」六列。详情列显示简短原因或「{rows} 行 / {elapsed}ms」,一眼能看出哪些调用没有返回数据。
右上角「筛选」支持开始日期、结束日期、工具、连接、状态与令牌六个条件,可组合使用;「清除筛选」恢复全量。列表每页 50 条,单次最多加载 5000 条,超出后请用筛选或时间范围缩小范围。
详情:一次调用到底发生了什么
点击任意一行打开「日志详情」,可以看到完整令牌、工具、连接、状态、耗时与行数;被拒绝或出错时还有「原因」,SQL 区域保留可复制的原始语句。
SQL 文本最多保存 20000 个字符,超出会被截断并标注;原因最多保留 500 个字符。需要完整 SQL 时,应在调用方或调试日志里另行留存。
脱敏与保留
SQL 字面量脱敏默认关闭,日志会按原样保存语句。开启后,字符串、数字等字面量会被统一替换为 REDACTED,结构、表名与函数名保留,仍然可以判断语句类型。
开启脱敏后,解析失败的语句记为 [SQL REDACTED: PARSE FAILED],方言无法识别的记为 [SQL REDACTED: DIALECT UNKNOWN],不会退回到明文保存。
audit.db。处理生产数据时建议开启「脱敏 SQL 字面量」,并避免把审计文件上传到公共位置。保留天数默认 7 天,可选 3、7、15、30 天。每次写入新记录时,应用会顺手删除早于截止时间的记录,所以日志不会无限增长;修改保留天数不会找回已删除的历史。
审计页的「清理日志」用于手动清空全部记录,通常在交接或排障后使用,操作前请确认不再需要这些证据。审计库与配置在同一目录,备份时不要只拷 config.toml。
三种拦截来源
「拒绝」状态可能来自三个完全不同的地方。看原因文案就能区分,处理方式也不同。
| 来源 | 原因特征 | 去哪里处理 |
|---|---|---|
| 只读策略 | DDL、DML、多语句、副作用函数、解析失败等策略文案。 | 改写 SQL;先到「设置 → 安全 → 策略检查台」预检。 |
| 工具开关与令牌权限 | 「工具已关闭」或「未授权给该访问令牌」。两者是不同的报错,看原因文案即可区分。 | 「工具」页打开全局开关,或到「访问控制」调整该令牌的数据库与工具权限。 |
| 自动熔断 | 令牌在统计窗口内拦截次数达到阈值,被自动停用。 | 「访问控制」重新启用令牌,或调整熔断窗口与阈值。 |
启动服务、自动启动 MCP 与熔断动作本身也会留下系统记录,令牌列显示「系统」。排查「令牌为什么突然失效」时,先找那条自动熔断记录,再回看它之前的拒绝记录。
用审计排查问题
先筛状态
选「拒绝」「超时」或「错误」,把范围缩到失败调用;再按时间范围定位到出问题的那次会话。
读原因
原因文案已经区分策略、权限、连接与数据库错误。先按原因去对应章节处理,不要急着重装或改限额。
看 SQL 与策略
打开详情复制 SQL,在「策略检查台」用相同方言重放;能看到被改写后的行数限制,也能确认是否有多语句或副作用函数。
对照令牌与连接
同一个错误只出现在某个令牌或某个连接上,问题就在权限或连接配置;所有令牌都失败,再查服务与网络。
设置项说明#
设置页决定 DataNexa 怎样运行:服务开不开、Agent 手里有多少权限、日志留多久、驱动与运行时放在哪里。下面按 5 个标签页说明每组选项改的是什么、会影响哪些地方,以及什么时候需要改。
通用:服务策略、显示、启动、审计、导入导出
通用分 5 组。第一组直接影响 MCP 服务本身,后面几组影响本机体验与数据留存;每组的改动范围各不相同,改之前先对照下表。
| 分组 | 改什么 | 会影响什么 | 什么时候改 |
|---|---|---|---|
| MCP 服务策略 | 监听地址、端口、要求 Bearer 密钥 | 服务端点与鉴权方式。服务运行中改地址会重新绑定监听,绑定失败会自动回滚。 | 端口被占用、需要与其他服务共存,或要收紧/放宽鉴权时。 |
| 显示 | 界面语言、界面动效、主题 | 只影响本机界面,不改变 Agent 能做什么。 | 换语言、夜间使用,或觉得「能量脉冲」光效干扰时。 |
| 启动与后台 | 登录时启动 DataNexa、启动时自动开启 MCP 服务、自动激活轻量模式 | 决定重启或重新登录后 Agent 是否还连得上,以及关闭窗口后是否释放界面资源。 | 希望开机后 Agent 直接可用,或想让常驻进程更省资源时。 |
| 审计日志 | 日志保留天数、脱敏 SQL 字面量 | 历史记录能回溯多久,以及 SQL 里的字面量是否原样落盘。 | 排查周期长于默认保留期,或要把日志交给别人看时。 |
| 导入/导出 | 导入连接、导出连接 | 导入只追加、不覆盖现有连接;导出默认要求加密密码,也可以选择明文导出。 | 换机、备份,或要把一套连接交给同事时。 |
- 监听地址与端口:端口输入框接受 1–65535,越界的取值会被夹回范围;监听地址只接受 127.0.0.1 或 localhost。
- 启动与后台:勾选「登录时启动 DataNexa」后,「启动 DataNexa 时自动开启 MCP 服务」会自动打开并锁定,因为开机自启动后,服务会随登录一起常驻。
- 轻量模式:开启后,窗口关闭 5 分钟会自动释放窗口界面资源,后台 MCP 服务与已建连接不受影响。
- 审计日志:保留天数可选 3 / 7 / 15 / 30 天;「脱敏 SQL 字面量」默认关闭,关闭时 SQL 里的字符串与数字原样写入,打开后字面量统一替换为占位符;解析失败或方言未知时,整条 SQL 会被替换为对应的 REDACTED 标记,不会回退到明文。
安全:拦截统计、六层防护、自动熔断
安全标签页是一块仪表盘,不是开关面板:顶部数字是过去 24 小时内被拒绝的数据库操作数,取自界面已加载的审计记录(最多 5000 条,达到上限会显示加号提示实际次数可能更多)。两个按钮分别打开「策略检查台」和「审计日志」。这一页只有熔断参数可以改,其余各层由程序固定。
- 六层防护:L1 网络、L2 认证、L3 语法、L4 数据库、L5 资源、L6 审计。只有 L2 会随 Bearer 开关变化,关闭时标题变成「全链路数据安全防护未完全启用」,并标出「未启用」。
- 自动熔断:同一令牌在统计窗口(1/5/10/30/60 分钟,默认 10)内被拒次数达到阈值(3/5/10/20/50 次,默认 5)就自动停用并写一条审计。调用量大、Agent 常写错 SQL 时可以把阈值调高;Bearer 未开启时整组不可用。
- 策略检查台:只做静态预检,选 MySQL / PostgreSQL / SQLite 方言,得到「允许执行」或「已拒绝」、原因,必要时还有改写后的 SQL。它不连接真实数据库,也不写审计日志。
六层防护各自的机制、能挡什么、挡不住什么,见安全模型;令牌被熔断后如何恢复,见访问控制;拦截记录怎么筛,见审计日志。
JDBC 支持:只在这里管运行时与驱动
这个标签页带「预览」徽标,负责 Java 运行时与驱动 Bundle 两件事。新建 JDBC 连接、填 Driver Class、拼 JDBC URL 以及排错都在JDBC 支持一章,这里只说它与设置的关系;只有在需要连接原生不支持的数据库时,才需要进这一页。
- Java 运行时:显示是否可用、版本与来源(DataNexa 下载或外部)。可以下载托管运行时、检查更新、选择外部运行时、切回托管或卸载托管运行时;卸载只删除 DataNexa 下载的那一份,外部运行时不受影响。
- JDBC 驱动:按 Maven 坐标安装,或导入本地 JAR。列表显示 Driver Class、体积与两项「驱动原生支持」标识(只读限制、超时限制);未探测时显示「测试连接后检测」,执行一次测试连接或 MCP 查询后才会记录结果。
- 保证与风险:底部固定写明「无论驱动原生能力如何,DataNexa 的只读保护与超时兜底始终生效」,旁边可展开风险详情,列出方言解析与资源消耗方面的限制。
存储与性能:磁盘、缓存与资源
顶部两张卡片切换视图:空间占用看磁盘,资源监控看 CPU 与内存。数据每 5 秒自动刷新一次,不需要手动点刷新。磁盘吃紧、或怀疑某次查询把内存吃满时,先来这里看。
- 空间占用:给出总大小、占比条与逐项明细(Java 运行时、JDBC 驱动、Maven 仓库、审计与日志、访问控制、配置文件、调试日志、其他文件),每项都标出真实路径。
- 释放空间:只清理 Maven 下载缓存和调试日志;已安装驱动、审计日志与配置不受影响。没有可清理项时,弹窗会直接说明。
- 资源监控:总 CPU 与内存按 DataNexa、JDBC 驱动、系统其他占用拆分;下面按进程列出 PID、CPU 与内存,驱动运行时状态异常或卡住时可以「停止运行时」。
- 打开数据目录:在文件管理器里打开 DataNexa 的数据目录,明细里的路径可以在这里逐一核对。
关于:版本、更新与调试入口
版本号、更新通道与应用入口都集中在这个面板,页脚放官方主页与 GitHub 项目页。版本对不上、或要反馈问题时,从这里取信息。
- 更新:可手动检查;有新版本时能看更新说明或立即更新。本地编译版本不显示更新日志链接,只提供 Releases 入口。
- 更新偏好:「每天自动检查更新」默认开启;「更新下载加速」由 GH-Proxy 提供,开启后检查更新、下载安装包与 Java 运行时都经该服务访问 GitHub,只转发公开的 Release 文件,安装包与运行时仍会校验签名与 SHA-256。
- 调试日志:默认隐藏,连续点 5 次版本号才会出现。开启前会弹出确认框(仅用于排查问题、有轻微性能开销、内容已脱敏),开启后可按旁边的按钮直接打开日志文件夹。
它防什么,不防什么#
这一章把 DataNexa 的防护拆成可以逐条核对的清单:假设了什么前提、每一道防护各挡什么、哪些风险留在防护之外,以及凭据到底放在哪里。看完你应该能判断自己的部署还差哪一层。
威胁模型:三个前提
DataNexa 的假设很具体:本机的操作系统与登录账户可信,安装包没有被替换,数据库账号由你在连接里配置。在这些前提下,它要保证的是「Agent 提议的操作在到达数据库之前被检查」。
它不假设 Agent 一定有恶意,但即使 Agent 有 bug 或被诱导,也只能拿到你授权的那些数据库与工具。
| 威胁 | DataNexa 的做法 | 剩下的风险 |
|---|---|---|
| Agent 写出 DDL、DML 或多条语句 | AST 只读校验直接拒绝,并给查询补上外层行数上限。 | 解析器不认识的方言可能漏判,JDBC 路径最明显。 |
| Agent 读到不该读的数据库 | 令牌按数据库连接与工具分别授权。 | 令牌泄露,等于把这份权限交给别人。 |
| 一次查询把整张表拖回来 | 行数、超时、连接池、结果大小与调用速率限额。 | 复杂查询即使结果被截断,也可能已在数据库侧消耗资源。 |
| 远端或网页调用本机端口 | 只监听回环地址,逐个请求校验 Host 与 Origin,界面启用严格 CSP。 | 本机其他进程仍可访问这个端口。 |
| 出事后查不出 Agent 做过什么 | 每次工具调用写本地审计,可按令牌追溯。 | 日志放在本机,本机用户可以直接改动。 |
六层防护,再加两道令牌闸门
下面的顺序就是一次调用的实际经历:先过网络与认证,再过语法与数据库,最后被资源限额和审计收尾。前六行与设置页「安全」标签里的 L1–L6 一一对应,最后两行是令牌自带的两道闸门。任何一层拒绝,调用都不会继续往下走。
| 防护层 | 实现方式 | 主要挡住什么 |
|---|---|---|
| L1 网络 | 只绑定 127.0.0.1 或 localhost;每个 MCP 请求校验 Host 与 Origin;界面使用严格 CSP。 | 其他机器与网页发起的请求。 |
| L2 认证 | 默认要求 Bearer 密钥;令牌可免重启轮换,停用或轮换后旧密钥立即失效。 | 本机其他程序随手调用你的服务。 |
| L3 语法 | 基于 SQL 语法树的校验:只放行单条 SELECT、安全的 WITH SELECT 与只读 EXPLAIN,拒绝 DDL、DML、SELECT INTO、锁、文件读写、dblink 与 sleep 类函数。 | Agent 写错语句,或借函数产生副作用。 |
| L4 数据库 | SQLite 以只读方式打开;MySQL 会话设为只读并下发语句超时;PostgreSQL 设 default_transaction_read_only。 | 语法层漏过的写入意图,在数据库侧再拦一次。 |
| L5 资源 | 最大行数、查询超时、连接池、结果字节上限;工具调用限速 2 次/秒(突发 20),并发上限 8。 | 一次调用拖垮数据库或本机。 |
| L6 审计 | 每次工具调用写本地审计库:工具、连接、状态、耗时、行数、SQL;可脱敏字面量,按天裁剪。 | 事后无法还原 Agent 做过什么。 |
| 令牌权限 | 每个令牌可以单独禁用某些数据库连接与工具,改动即时生效。 | 一个 Agent 越权到别的库,或调用它用不到的工具。 |
| 自动熔断 | 同一令牌在统计窗口内被拒次数达到阈值,自动停用并写一条审计。 | 失控的令牌持续重试。 |
能防与不能防
这些情况会被挡住
- 在只读工具里提交 DDL、DML、多语句或 SELECT INTO:AST 层直接拒绝,请求不会到达数据库。
- 没带正确 Bearer 密钥的请求返回 401;Host 或 Origin 不是本机回环的请求返回 403。
- SQLite、MySQL、PostgreSQL 上的写入意图:数据库层的只读设置会再拦一次。
- 查询跑太久、返回行数或结果过大:被超时、行数上限或截断收住。
- 同一个令牌反复被拒:达到阈值后自动停用。
- 事后追查:审计日志按令牌、连接与工具记录每一次调用。
这些情况它管不了
- 本机被攻破、DataNexa 被替换或进程被注入:应用自身已不可信。
- 恶意 JDBC 驱动:它以你的权限运行本地 Java 代码。
- 数据库账号本身带写权限时的人为越权:真正的最后一道闸是只读账号。
- 未知方言的隐蔽副作用:JDBC 路径只能做有限的语法与词法判断。
- 数据本身敏感:只读不等于不泄露,读到的内容仍然会交给 Agent。
- 审计日志被本机用户修改或删除:日志是本地文件,没有远端副本。
凭据与数据放在哪里
「设置 → 存储与性能」会为每个存储项列出实际路径。下表说明各自存了什么、靠什么保护。
| 内容 | 位置 | 保护方式 |
|---|---|---|
| 连接与策略配置 | 应用配置目录的 config.toml | 只保存 Vault 引用,不含数据库密码。 |
| 数据库密码 | 操作系统凭证库 | 由系统钥匙串或凭据管理器保护。 |
| 访问令牌 | 应用配置目录的 access-control.db | Unix 下文件权限 0600;密钥以明文保存在库中用于比对,请把该目录当作凭据保护。 |
| 审计记录 | 应用配置目录的 audit.db | 本地 SQLite;SQL 字面量可选脱敏。 |
| 调试日志 | 数据目录的 logs 文件夹 | 仅在你手动开启后写入,4 MiB 轮转保留 3 份。 |
| JDBC 驱动与运行时 | 数据目录 | 驱动 JAR 安装后不做修改,使用前按清单里的 SHA-256 校验;运行时来自托管下载或你选择的外部路径。 |
| 导出的连接文件 | 你选择的位置 | 默认用 Argon2id 加密;选明文导出时密码不再受凭证库保护。 |
导出连接与紧急断连的操作见数据库连接;令牌的权限勾选、轮换与恢复见访问控制。
JDBC 的额外风险
JDBC 是唯一能连接 DataNexa 没有原生支持的数据库的通道,代价是防护从结构化的语法规则退化为有限判断。
- 驱动及其依赖以本地 Java 代码运行,与你同权限,安装即等于信任。
- 未知方言下,只读策略可能只能做有限的检查,无法保证识别所有写入或其他副作用。
- 部分数据库能力不可用;复杂查询即使结果被截断,也可能已在数据库侧消耗资源。
建议这样配置
- 给 DataNexa 单独建只读账号,只授 SELECT 与读取元数据所需的权限。
- 保持「要求 Bearer 密钥」开启,一个 Agent 一个令牌。
- 只勾选该 Agent 真正需要的数据库连接与工具,不要一律全开。
- 开启自动熔断,并按调用量调整统计窗口与阈值。
- 审计保留期选得比排查周期长;需要把日志交给别人看时,打开 SQL 字面量脱敏。
- 能走原生连接就不走 JDBC;确实要用时,只用可信来源、版本明确的驱动。
- 不再需要 MCP 服务时,在概览页停止它,不要让端口长期可用。
边界声明
换个说法:DataNexa 把「Agent 直接连数据库」变成「Agent 通过一个会检查、会限流、会记账的网关连数据库」,但它不改变数据库账号本身的权限。
需要更强保证时,请在数据库侧收紧权限与网络访问,而不是只依赖 DataNexa。发现可疑记录,先从审计日志找到那次调用,再到访问控制核对该令牌的权限是否合理。
常见问题#
这一章按「症状 → 原因 → 处理」整理排错路径。多数问题在概览页状态、审计日志和调试日志里就能定位,不需要重装。
应用打不开,或 MCP 服务起不来
症状:双击图标没有窗口;或窗口打开了,但概览页服务状态一直是「启动失败」,托盘菜单提醒「MCP 服务启动失败」。
原因:通常是端口被其他程序占用,或者 config.toml 被手工改坏、无法通过配置校验。
- 把指针停在概览页服务状态上读取原始错误;端口冲突一般带有
Address already in use。 - 换一个端口:设置 → 通用 → MCP 服务策略 → 端口,保存后回到概览页点「启动服务」。端口范围 1–65535,监听地址只能是
127.0.0.1或localhost。 - 仍然打不开时,退出应用,把
config.toml改名备份后重新启动,应用会写回默认配置;连接需要重新添加,数据库密码仍保存在系统凭证库中。 - 如果开启开机自启动时提示登录项注册失败,macOS 需要应用已签名并从
.app中运行;签名与系统权限问题只能由安装方式解决。
Agent 连不上,或收到 401 / 403
症状:Agent 报连接被拒绝、请求超时,或返回 401、403。
原因:服务没有运行;客户端填的端口与实际监听端口不一致;Bearer 鉴权开启但请求没带密钥,或密钥在「手动轮换」后已失效;访问令牌被停用或自动熔断;请求的 Host / Origin 不是本机地址。
- 在概览页确认状态是「运行中」,端点形如
http://127.0.0.1:17321/mcp;需要核对时以「设置 → 通用 → MCP 服务策略」里的监听地址与端口为准。 401表示缺少或无效的 Bearer 密钥:在客户端配置Authorization: Bearer <token>,密钥可到「访问控制」用该令牌的「复制 Agent Prompt」重新取回;轮换后所有客户端都要同步更新。403表示 Host 或 Origin 不被允许:请求必须使用127.0.0.1/localhost,经反向代理或局域网地址访问会被拒绝。- 客户端需要 POST JSON-RPC,
Content-Type: application/json,Accept同时包含application/json与text/event-stream;GET 返回405属正常,说明该端点不提供流式 GET。
查询被拒绝
症状:Agent 报告语句被拒绝,例如「只读策略已阻止 DDL、DML、破坏性语句和可能产生副作用的 SQL。」或「每次工具调用只允许一条 SQL 语句。」
原因:语句不是单条只读查询;工具或数据库连接不在该令牌的权限内;工具在工具页被关闭;紧急断连正在生效。
- 改成单条
SELECT、安全的WITH ... SELECT或EXPLAIN;不要拼接多条语句,SELECT INTO、文件导入导出和明显有副作用的函数都会被拦。 - 先用「设置 → 安全 → 策略检查台」以相同方言预检,确认是策略问题还是权限问题。
- 到「访问控制」核对该令牌的数据库与工具权限;提示会区分「工具未授权」与「连接未授权」。
- 到「工具」页确认工具开关;被关闭的工具不会出现在 Agent 的工具列表里。
- 若提示紧急断连生效,先在「数据库连接」页顶部或概览页服务状态卡退出紧急断连,再让 Agent 重试。
查询超时,或结果被截断
症状:审计记录状态为「超时」或「截断」;提示「查询超过 8000ms 超时上限。该连接已丢弃,下次调用会重新建立连接。」
原因:连接默认限制为查询超时 8000ms、最大返回行数 500、单次结果上限 1 MiB。扫描大表或返回大字段时,会先撞上其中一个上限。
- 缩小范围:加过滤条件、只取需要的列、先聚合再取数,比直接放宽限额更有效。
- 在连接编辑里调整「查询超时毫秒」与「最大返回行数」(上限 60000ms、5000 行),需要时再放宽「最大结果大小」。
- 返回结果里
truncated为true时不完整,不要用它推断总行数或做全量统计。 - 超时后连接会被丢弃,下一次调用会自动重连,不需要重启服务或重新保存连接。
SQLite 数据库打不开
症状:「测试连接」失败,提示无法打开数据库或只读打开失败。
原因:SQLite 连接以只读方式打开文件。路径不对、文件不存在、当前系统账号没有读权限,或文件被其他程序独占时都会失败。
- 在连接编辑里确认「数据库文件」是完整路径,包含文件名与后缀,不要只填目录。
- 确认运行 DataNexa 的系统账号对文件有读权限,对文件所在目录有读写权限。
- 关闭可能持有写锁的客户端或同步工具后重试;把库文件放在同步盘、网络盘上也容易出现锁冲突。
- 加密或专有格式的库文件不能直接连接,需要先在原工具里导出为普通 SQLite 文件。
MySQL 时间显示不对
症状:时间字段的值与在 MySQL 客户端里看到的结果差几个小时。
原因:DataNexa 把时间类型的值统一按 UTC 返回。MySQL 的 TIMESTAMP 会按会话时区转换,DATETIME 不转换,服务器时区、会话时区与读取端理解不一致时就会产生偏移。
- 在 Agent 侧按 UTC 解读返回值,再在展示层转成本地时区,不要直接当成本地时间使用。
- 需要本地时间时在 SQL 里显式转换(例如
CONVERT_TZ),不要依赖连接默认时区。 - 对照服务器的
time_zone与会话时区,确认写入时用的是哪一套规则,再判断是读取问题还是存储问题。
JDBC 驱动装不上
症状:安装驱动失败,提示「Maven 坐标必须使用 groupId:artifactId:version 格式」「Maven 完成后没有生成 JDBC 驱动 JAR 文件」或「已安装的 Bundle 未提供任何 JDBC Driver 实现」。
原因:坐标写错或版本不存在;镜像源不可达、不是 HTTPS;驱动 JAR 里没有 java.sql.Driver 实现;本地导入时只选了驱动 JAR,没有带上运行时依赖。
- 按
groupId:artifactId:version填写坐标,先在 Maven Central 确认该版本存在。 - 换一个可访问的 HTTPS 镜像源,或改用「导入本地驱动」。
- 本地导入时把驱动 JAR 及其依赖一起选中;安装后仍未发现 Driver Class 的,在连接里手工填写 Driver Class。
- 删除驱动前先删除或改用引用它的连接,仍被连接引用的驱动无法删除。
缺少 Java 运行时
症状:使用 JDBC 连接时报「DataNexa Java 运行时尚未安装。请下载或选择外部 Java 运行时。」或「选定的外部 Java 运行时不可用。」
原因:安装包不内置 Java 运行时;选择的外部运行时被移动或删除;托管运行时下载后校验失败。
- 打开 设置 → JDBC 支持,点「下载 DataNexa Java 运行时」,完成后重试 JDBC 连接。
- 本机已有 JDK 时,用「选择外部 Java 运行时」指向它的主目录;更换后原连接不需要重建。
- 下载慢或中断时,可开启「设置 → 关于 → 更新下载加速」重试;仍失败时手动安装 JDK 再选择外部运行时。
- JDBC 会话运行期间不能卸载运行时,先停止相关会话再卸载。
审计日志没有记录
症状:审计页一直显示「暂无访问记录。」
原因:没有发生真正的工具调用;筛选条件把已有记录过滤掉了;记录已超过保留天数被自动清理;审计存储迁移未完成时 MCP 服务不会启动。
- 先清除筛选条件:时间范围、工具、连接、状态或令牌都可能把记录过滤掉。
- 让 Agent 调用一次
datanexa_list_connections或执行一条只读查询,再刷新审计页。 - 确认「设置 → 通用 → 审计日志 → 日志保留天数」;默认 7 天,可选 3、7、15、30 天。
- 若提示审计日志迁移失败,按提示重试;旧日志确认不再需要时,可选择隔离旧日志并继续。
datanexa_policy_check也会留下审计记录;如果连它都没有,说明请求没有到达服务端,先检查服务状态与鉴权。
语言或主题没有生效
症状:切换界面语言或主题后界面没有变化,重启后又变回原样。
原因:语言默认跟随系统,只有主动选择才会写入配置;主题不写入 config.toml,由界面本地保存;语言只接受 zh-CN 与 en 两个值。
- 语言有两个入口:概览页顶部的语言按钮,或「设置 → 通用 → 显示 → 界面语言」。
- 中文系统默认中文,其他语言默认英文;修改系统语言后需要重启应用才会跟随。
- 主题在「设置 → 通用 → 显示 → 主题」里切换「跟随系统 / 浅色 / 深色」,保存后立即生效;未生效时重启应用再看。
- 手工编辑配置时,
language只能写zh-CN或en,其他值会被清空并回退到系统语言。
数据目录、重置与卸载残留
症状:想备份或彻底重置配置;或卸载重装后,旧连接、旧审计记录仍然存在。
原因:配置、审计与访问控制数据库在配置目录,驱动、Maven 缓存、Java 运行时与调试日志在数据目录。卸载程序不会删除这些目录,也不会清理系统凭证库。
- 打开目录:设置 → 存储与性能 → 打开数据目录;具体路径见第 13 章,macOS 与 Windows 上配置目录和数据目录是同一个文件夹。
- 备份优先用「导入/导出 → 导出连接」;导出文件包含明文密码,用完及时删除。
- 彻底重置:退出应用后重命名或删除
config.toml、audit.db、access-control.db再启动,应用会重建默认配置;连接和审计记录会丢失,密码仍留在系统凭证库。 - 卸载后要清理干净,删除上述目录,并在系统「钥匙串访问」或「凭据管理器」中删除
com.mingo.datanexa条目。
如何反馈问题
症状:以上路径都试过仍然失败,或界面给出的错误无法判断原因。这时请带上可复现的信息一起反馈。
- 在 GitHub Issues 提交,写清复现步骤、期望结果和实际结果。
- 附上环境信息:操作系统、数据库类型与版本;涉及 JDBC 时补充驱动名称与版本。
- 附调试日志:设置 → 关于连续点按版本号区域 5 次开启「启用调试日志」,复现问题后在设置中打开日志文件夹取文件。
- 提交前移除连接字符串、数据库名、账号、Token、SQL 字面量和业务数据;安全问题不要发公开 Issue。
附录#
这一章把散落在各章的查表信息集中起来:文件位置、配置示例、默认值、工具名、术语与链接。排错时可以把它当作对照表使用。
文件与目录位置
配置、审计与访问控制数据库放在配置目录,驱动、Maven 缓存、Java 运行时与调试日志放在数据目录。macOS 与 Windows 上两者是同一个文件夹。应用内的「设置 → 存储与性能 → 打开数据目录」直接打开数据目录。
| 内容 | macOS | Windows |
|---|---|---|
| 配置目录 | ~/Library/Application Support/com.mingo.datanexa/ | %APPDATA%\com.mingo.datanexa\ |
| 数据目录 | ~/Library/Application Support/com.mingo.datanexa/ | %APPDATA%\com.mingo.datanexa\ |
| 配置文件 | config.toml | config.toml |
| 审计数据库 | audit.db | audit.db |
| 访问控制数据库 | access-control.db | access-control.db |
| JDBC 驱动 | jdbc-drivers/ | jdbc-drivers/ |
| Maven 缓存 | maven-repository/ | maven-repository/ |
| Java 运行时 | jdbc-runtime/ | jdbc-runtime/ |
| 调试日志 | logs/ | logs/ |
com.mingo.datanexa,它不随界面语言变化。数据库密码不在这些文件里,而是存放在系统钥匙串中,服务名为同一个标识。配置文件示例
下面是 config.toml 的等价示例,字段与默认值来自应用本身。密码不会写入该文件,连接只保存一个指向系统凭证库的引用。修改前请先退出应用,改坏后应用可能无法启动。
version = 1
[server]
host = "127.0.0.1"
port = 17321
require_token = true
[settings]
audit_retention_days = 7
audit_redact_sql_literals = false
auto_check_updates = true
github_acceleration = false
auto_start_mcp = false
auto_run_mcp = false
auto_lightweight_mode = false
mcp_activity_effects = true
language = ""
auto_circuit_breaker = false
auto_circuit_breaker_window_minutes = 10
auto_circuit_breaker_threshold = 5
debug_logging_enabled = false
[[connections]]
id = "local_data"
name = "Local Data"
type = "sqlite"
enabled = true
database = "/Users/you/data/local.db"
max_rows = 500
query_timeout_ms = 8000
max_connections = 1
max_result_bytes = 1048576
token 这类由应用维护的字段不要手写;id 必须以字母或下划线开头,只能包含字母、数字、下划线与短横线。language 只接受 zh-CN 或 en,留空表示跟随系统。数值超出范围时会被自动夹到最近的合法值。默认值速查
| 项目 | 默认值 | 可调范围 |
|---|---|---|
| 监听端口 | 17321 | 1–65535 |
| 监听地址 | 127.0.0.1 | 仅 127.0.0.1 或 localhost |
| Bearer 鉴权 | 开启 | 可关闭 |
| 最大返回行数 | 500 | 1–5000 |
| 查询超时 | 8000 ms | 500–60000 ms |
| 最大连接数 | 1 | 1–3 |
| 结果大小上限 | 1 MiB | 64 KiB–8 MiB |
| 审计保留天数 | 7 天 | 3 / 7 / 15 / 30 天 |
| 自动熔断窗口 | 10 分钟 | 1 / 5 / 10 / 30 / 60 分钟 |
| 熔断拦截阈值 | 5 次 | 3 / 5 / 10 / 20 / 50 次 |
| 工具并发上限 | 8 | 固定 |
| 工具调用速率 | 约 2 次/秒,突发 20 | 固定 |
| 审计列表上限 | 5000 条 | 固定 |
| 审计记录 SQL 上限 | 20000 字符 | 固定 |
工具名速查
七个工具分三组;工具名需要在客户端或提示词里精确引用,区分大小写。关闭的工具不会出现在 Agent 的工具列表里,详细参数见第 08 章。
| 工具名 | 分组 | 作用 |
|---|---|---|
datanexa_list_connections | 结构发现 | 列出已启用的连接。 |
datanexa_get_schema | 结构发现 | 读取表与视图列表。 |
datanexa_describe_table | 结构发现 | 读取单张表的列信息。 |
datanexa_sample_rows | 数据访问 | 读取受限的样本行。 |
datanexa_execute_readonly_sql | 数据访问 | 执行单条只读查询。 |
datanexa_explain_sql | 分析与策略 | 返回查询计划。 |
datanexa_policy_check | 分析与策略 | 静态策略检查,不连库,但会写审计。 |
术语表
| 术语 | 说明 |
|---|---|
| MCP | Model Context Protocol,Agent 调用外部工具的协议;DataNexa 是它的服务端。 |
| Streamable HTTP | MCP 的 HTTP 传输方式,用 POST 发送 JSON-RPC 请求。 |
| JSON-RPC | 请求与响应都带 jsonrpc、id、method 或 error 的轻量协议。 |
| Bearer | 放在 Authorization 头里的令牌方案;访问控制依赖它。 |
| AST | 抽象语法树。只读策略解析 SQL 后按语句类型判断,而不是匹配字符串。 |
| 只读事务 | 数据库层的第二道防线;MySQL / PostgreSQL 连接以只读事务执行查询。 |
| 访问令牌 | 带数据库与工具权限的 Bearer 密钥,一 Agent 一枚。 |
| 熔断 | 同一令牌在窗口内被拒次数达到阈值后自动停用,避免持续误用。 |
| Bundle | JDBC 驱动包:驱动 JAR、依赖与清单,安装后不可变。 |
| JDBC | Java 的数据库访问接口;DataNexa 通过它连接原生支持之外的数据库。 |
MCP 协议支持
支持 2025-03-26、2025-06-18、2025-11-25 三个协议版本;客户端不发送版本头时,按 2025-03-26 处理。
相关链接
没有找到你要的答案?
把系统版本、数据库类型、错误提示和脱敏后的日志一起提交,能更快定位问题。