数据Dan
一个极简主义的PostgreSQL MCP,为Claude Code提供对数据库的权限绑定访问。
- 问题:人工智能代理因意外删除数据库而臭名昭著,因为没有任何声明来防止会话过度或冲动行事。
- 解决方案:DataDan允许您为数据库、模式和表授予作用域权限。
快速开始
添加一个 .env 将PostgreSQL连接字符串添加到项目中,然后将DataDan添加到 .mcp.json:
{
"mcpServers": {
"datadan": {
"command": "npx",
"args": ["-y", "datadan", "start"]
}
}
}就是这样。在第一次运行时,DataDan会自动发现您的数据库,创建 datadan.config.yaml 使用只读访问权限,并一次性启动MCP服务器。重新启动Claude Code,它就可以读取您的数据库。
在任何项目中使用
选项A:每个项目(默认)
添加 .mcp.json 将上面的条目添加到每个项目目录中。首先 start,DataDan扫描 .env,创建 datadan.config.yaml,并注册自己。
要手动重新初始化,请执行以下操作:
npx datadan init选项B:全局配置,从任何地方指向
在任何地方创建一个配置文件:
name: my-databases
default-permission: read
hot-reload: true
databases:
- name: production
connection_string: ${DATABASE_URL}
- name: analytics
connection_string: ${ANALYTICS_DB_URL}然后在任何项目的 .mcp.json:
{
"mcpServers": {
"datadan": {
"command": "npx",
"args": ["datadan", "start", "--config", "/path/to/datadan.config.yaml"]
}
}
}或设置 DATADAN_CONFIG env-var指向您的配置。
选项C:用户级MCP配置
增添 ~/.claude/settings.json 使DataDan在每个项目中都可用:
{
"mcpServers": {
"datadan": {
"command": "npx",
"args": ["datadan", "start", "--config", "/home/you/datadan.config.yaml"]
}
}
}配置
datadan.config.yaml 控制克劳德可以做什么:
name: my-project
default-permission: read
hot-reload: true
databases:
- name: main
connection_string: ${DATABASE_URL}
# permission: write # override default for this database
# schemas:
# - name: public
# permission: write # override for this schema
# tables:
# - name: users
# permission: none # block access to this table权限
权限级联: default-permission -> database -> schema -> table.最具体的优先权获胜。
| 级别 | 克劳德能做什么 |
|---|---|
none | 完全无法访问 |
read | SELECT,描述表格 |
write | 读取+插入,更新 |
delete | 写入+删除 |
yolo | delete+CREATE、ALTER、DROP、TRUNCATE |
环境变量
连接字符串支持 ${ENV_VAR} 语法。DataDan加载 .env 与配置文件位于同一目录。Shell/CI变量优先。
热重新加载
随着 hot-reload: true,DataDan在每次调用工具之前都会重新读取配置。在会话过程中更改权限,而不重新启动。
工具
连接后,Claude Code将获得以下工具:
| 工具 | 权限 | 描述 |
|---|---|---|
list_databases | any | 列出所有可访问的数据库 |
list_schemas | any | 列出数据库中的架构 |
list_tables | any | 列出架构中的表 |
describe_table | read | 显示列、类型、键和约束 |
query | read | 运行SELECT语句 |
execute | write | 运行INSERT/UPDATE语句 |
delete | delete | 运行delete语句 |
run_migration | yolo | 运行DDL(CREATE、ALTER、DROP、TRUNCATE) |
dbml | read | 将数据库结构导出为DBML文件 |
register | - | 在运行时添加新的数据库连接 |
试运行
在不启动服务器的情况下预览已解析的权限:
npx datadan start --dry-run Database | Schema | Table | Permission
----------+--------+----------+-----------
main | public | users | read
main | public | posts | write
main | public | secrets | none安全
DataDan在应用程序层强制执行权限——它解析每个SQL语句,从配置中解析表级权限,并阻止超过授予级别的语句。它还写了一个 CLAUDE.md 告诉Claude Code永远不要直接连接到PostgreSQL的指令。
这本身是不够的。 Claude Code有一个Bash工具,可以读取您的 .env确定或错误的模型可以通过运行以下命令完全绕过DataDan psql $DATABASE_URL 或者编写一个直接连接的脚本。
使用受限的PostgreSQL用户
唯一不能绕过的强制是PostgreSQL级别的权限。你的 DATABASE_URL 应指向具有与DataDan配置匹配的授权的用户:
-- For read-only access
CREATE USER datadan_readonly WITH PASSWORD 'yourpassword';
GRANT CONNECT ON DATABASE yourdb TO datadan_readonly;
GRANT USAGE ON SCHEMA public TO datadan_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO datadan_readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO datadan_readonly;如果DataDan的配置为 read,DB用户应该只具有 SELECT。即使一个模型绕过DataDan并直接连接,它也会碰到同一堵墙。
将配置保存在项目目录之外
随着 hot-reload: true,DataDan重新阅读 datadan.config.yaml 在每次工具调用之前。如果文件可由Claude Code写入,则模型可以在会话中升级自己的权限。
将配置文件移出项目,并通过以下方式指向它 DATADAN_CONFIG:
# In your shell or CI env
export DATADAN_CONFIG=/etc/datadan/myproject.yaml或使用 --config 在你的 .mcp.json:
{
"mcpServers": {
"datadan": {
"command": "npx",
"args": ["datadan", "start", "--config", "/home/you/datadan.config.yaml"]
}
}
}纵深防御
| 层 | 它阻止了什么 |
|---|---|
| 受限数据库用户 | 通过Bash/psql/scripts直接绕过 |
| DataDan权限门 | 通过MCP工具意外超范围访问 |
| 配置项目目录外 | 通过热重新加载进行会话中期自升级 |
CLAUDE.md 指令 | 使用错误访问路径的行为良好的模型 |
DataDan作为最低权限DB用户之上的正确路径护栏最为有效,而不是作为独立的安全边界。
架构同步
DataDan在启动时自动发现新的模式和表,并在使用过程中定期发现。如果将表添加到数据库中,它会自动出现在配置中,继承最近的权限级别。
