DynamoDB Sage开源项目展示用Go实现MCP数据库访问安全方案,通过RiskAnalyzer对所有写操作做结构验证、Kafka异步写入防节流、Prometheus监控安全事件。
DynamoDB Sage 展示了如何保护 MCP 数据库访问的安全:一个 Go 语言的 RiskAnalyzer 负责验证工具调用,Kafka 异步写入防止触发限流,Prometheus 追踪安全事件——将这个模式应用到你的 Claude Code MCP 服务器上。
当你在生产数据库上通过 MCP 服务器让 Claude Code 与之交互时,你实际上给 LLM 提供了一条直接执行路径。这在安全上是一场噩梦。提示词注入、灾难性数据删除、资源耗尽都是真实存在的风险。
一位名为 Taofit 的开发者构建了 DynamoDB Sage——一个 Go 语言的 MCP 服务器,允许 LLM 智能体通过自然语言查询和管理 Amazon DynamoDB。其核心创新并非 LLM 集成本身,而是一个自定义的 RiskAnalyzer 拦截器,在任何操作触及 AWS 之前验证每个变更工具的调用。
这就是你在任何向 Claude Code 暴露数据库操作的生产级 MCP 服务器中需要的模式。
RiskAnalyzer 充当 LLM 与 AWS 之间的硬网关边界。每个变更性的或重负载的 JSON-RPC 工具调用都必须经过它。只读操作则跳过检查,以保持对话的响应速度。
该分析器做三件事:
结构性验证——根据显式的 JSON schema 检查工具调用。如果负载不匹配,直接拒绝。
表保护——强制执行数据边界限制:受保护表、只读表、批量大小上限。批量写入或删除表等破坏性操作会被阻止。
爆炸半径评估——估算影响范围:是否存在 PII 字段、容量/RCU 成本、批量大小。这项评估可以触发额外的审批或拒绝。
以下是文章中的简化 Go 代码:
func (ra *RiskAnalyzer) Analyze(ctx context.Context, req *mcp.CallToolRequest) (Assessment, error) {
// 1. Validate structural integrity against explicit JSON schemas
if err := ra.validateSchema(req); err != nil {
return Assessment{}, fmt.Errorf("validation violation: structural mismatch: %w", err)
}
// 2. Enforce data-boundary restrictions (protected tables, read-only tables, batch-size caps)
if err := ra.checkTableProtection(req); err != nil {
return Assessment{}, fmt.Errorf("authorization violation: execution path blocked")
}
// 3. Estimate blast radius — PII fields present, capacity/RCU cost, batch size
assessment := ra.estimateImpact(req)
return assessment, nil
}
你不能信任 LLM 的输出。即使有良好的提示词设计,对抗性提示词也能欺骗模型生成恶意负载。RiskAnalyzer 是你的强制执行层——它不依赖 LLM 表现良好,而是依赖无法被社会工程学攻破的硬代码。

这对于 Claude Code 用户尤为关键,因为 MCP 服务器已成为赋予 Claude 访问外部系统的标准方式。如果你正在为自己的数据库构建一个 MCP 服务器,你需要同样的模式。

列出你的 MCP 服务器中所有执行写入、删除或重负载读取(如全表扫描)的工具。这些才是需要进行风险分析的工具。
编写一个 Go(或其他语言)的函数,置于 MCP 工具调度器和数据库客户端之间。它应该:
根据 JSON schema 验证工具调用
根据受保护列表检查表名
估算操作的代价
在 DynamoDB Sage 中,大型操作(批量写入、建表)被发布到 Kafka topic 并异步处理。这可以防止 DynamoDB 限流导致聊天界面冻结。对于你自己的服务器,任何可能耗时超过几秒的操作都应考虑使用消息队列。
Prometheus 指标追踪工具延迟、DynamoDB 消耗的容量、Kafka 延迟和安全事件。这让你能够实时了解 LLM 正在做什么——以及何时被阻止。
如果你正在为自己的数据库构建 MCP 服务器,从一个简单的拦截器开始:

func riskCheck(tool string, args map[string]interface{}) error {
// Block dangerous operations
if tool == "drop_table" {
return fmt.Errorf("blocked: drop_table is not allowed")
}
// Validate table names
if table, ok := args["table"].(string); ok {
if protectedTables[table] {
return fmt.Errorf("blocked: %s is protected", table)
}
}
return nil
}
然后在执行之前,用这个检查包装每个变更性的工具调用。这是一个小小的改动,却能保护你免受灾难性的数据丢失。
如果你正在通过 MCP 向 Claude Code 暴露数据库,你需要 RiskAnalyzer。不要信任 LLM——在代码层面强制执行边界。这个模式已经过生产验证和实战检验。
For more on MCP security, check out our previous articles on [building secure MCP servers] and [Claude Code's tool permissions].
Originally published on gentic.news