PostgreSQL权限管理工具

DataDan是一款为Claude Code提供权限管理的PostgreSQL MCP工具,允许用户为数据库、模式和表设置范围权限,防止AI代理操作越界。

  • by CourtimusPrime
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 CourtimusPrime/DataDan-MCP

使用说明

数据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在启动时自动发现新的模式和表,并在使用过程中定期发现。如果将表添加到数据库中,它会自动出现在配置中,继承最近的权限级别。