
Db Gateway
io.github.4hmetuyar由 GitHub 帳號 4hmetuyar 發布v0.3.5更新於 Oct 24, 2026
KVKK/GDPR-compliant LLM-to-database gateway: PII masking, RBAC, rate limiting, audit log
概覽
本機 MCP 閘道,位於 AI 助理與資料庫之間,提供 PII 遮罩、以角色為基礎的資料表存取控制、速率限制與稽核記錄。
- 可以做什麼
- 列出並描述可存取的資料表,顯示角色限制與遮罩策略
- 查詢資料表中的資料列,敏感欄位會自動遮罩或移除
- 查詢閘道自身的稽核歷程,可依資料表、工具、操作、被拒呼叫或時間篩選
- 檢視目前設定、角色與速率限制狀態
- 在明確開啟寫入且資料表與角色皆獲授權時,插入、更新或刪除資料列
- 適用情境
- 適合需要讓助理讀取真實資料庫、但希望多一層防護的情況:PII 遮罩、依角色的資料表允許/拒絕清單、查詢速率限制與稽核軌跡。也適合需要證明對 LLM 資料庫存取具備 KVKK 或 GDPR 類控管的團隊。
- 執行需求
- 以 npm 套件形式在本機透過 stdio 執行(需 Node.js),通常設定於 Claude Desktop。需要資料庫連線:命令列方式使用 DATABASE_URL,或在程式碼中傳入既有的 Prisma、pg、mysql2、better-sqlite3 或 MongoDB 用戶端。作用中的角色由 GATEWAY_ROLE 或設定指定;選用設定包括 GATEWAY_PII_SCAN 與 GUARDBEE_TELEMETRY。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Db Gateway,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
@guardbee/mcp-db-gateway
🇬🇧 English | 🇹🇷 Türkçe | 🇨🇳 中文 | 🇯🇵 日本語 | 🇰🇷 한국어 | 🇧🇷 Português | 🇪🇸 Español | 🇩🇪 Deutsch
[npm version] [npm downloads] [License: MIT] [Smithery]
A KVKK / GDPR-compliant MCP (Model Context Protocol) server — adds a security layer between an LLM and a database.
Instead of querying your database directly, Claude (or any other LLM) goes through this gateway. Sensitive fields are masked automatically, table access is role-controlled, and every query is written to an audit log.
Telemetry is off by default. With
GUARDBEE_TELEMETRY=1it sends the server, tool, success, duration and short parameter values such as a file path; longer strings and fields likecontent,tokenorpasswordare replaced with a placeholder. See@guardbee/mcp-telemetry.
Features
- PII Masking — Turkish national ID, IBAN, email, phone, password hashes, etc. are masked automatically
- Role-Based Access (RBAC) — Per-role table allow/deny lists and field rules
- Rate Limiting — Global and per-table request windows
- Audit Log — Writable to console, a file, or an HTTP webhook
- Prisma / Postgres / MySQL / SQLite / MongoDB Adapters — Plug in an existing
PrismaClient, apgPool, amysql2Pool, abetter-sqlite3Database, or a MongoDBDbdirectly - Write Support (optional) — insert/update/delete, off by default; gated by per-table + per-role permission, protected-field guarding, and a "don't touch the whole table" safety net
- 195 unit tests — masking, the pipeline, RBAC, the rate limiter, the audit log, and every adapter (read + write) are covered
Recent Changes (2026-09-15)
Three new steps in this package's AI Gateway growth work:
1. The query_audit_log tool
Previously the gateway's audit log was write-only — it landed in one of the console/file/http sinks, but Claude itself had no way to look back and ask "what just happened, which calls got denied." Now it can:
- How it works:
AuditLoggergained an always-on, in-memory ring buffer that's completely independent of the configured sink (audit.bufferSize, default 200). Even when the sink is"http"(a fire-and-forget webhook), history is still queryable through this buffer. The buffer resets when the process restarts, and is never populated whileaudit.enabled: false. - Filters:
table,tool(the MCP tool name, e.g."delete_row"),operation(read/insert/update/delete),deniedOnly(denied calls only),since(an ISO 8601 timestamp),limit(default 50, max 200). Results come back newest-first. - A real bug fixed along the way:
registerDbTools(read tools) andregisterWriteTools(write tools) previously each built their ownGatewayPipeline/AuditLoggerinstance. That meant audit events frominsert_row/update_row/delete_rowcalls would never have appeared in the buffer thatquery_audit_logreads — there were two separate, unaware-of-each-other buffers.server.tsnow builds a singleGatewayPipelineinstance and shares it across both tool groups. - Tests:
src/__tests__/audit-logger.test.ts(10 tests — buffer capping, every filter, ring-buffer behavior) plus 3 tests added topipeline.test.ts(verifying that reads and writes land in the same buffer, thatdeniedOnly+tablefilters compose correctly, and that the buffer stays empty whileaudit.enabled: false).
2. The SQLite adapter
The gateway now works with better-sqlite3 alongside Prisma/Postgres/MySQL:
- Same security pattern as pg/mysql: table/column names can't be parameterized, so they're validated before being embedded in SQL — here using SQLite's
PRAGMA table_info(table)instead ofinformation_schema. A name that fails the format check (e.g.users"; DROP TABLE users;--) or isn't in the live schema is rejected before any query reaches SQLite. better-sqlite3is only an optionalpeerDependency— it was not added to the package's owndevDependencies, since it requires a native binding; tests (like the pg/mysql tests) were written against a simple mock object matching theSqliteQueryableinterface, without importing the real package.lastInsertRowidinstead ofRETURNINGfor insert: since SQLite'sRETURNINGsupport is version-dependent, this follows the same approach as the MySQL adapter'sinsertId— if the table has anidcolumn and it's not already indata, the inserted row getslastInsertRowidattached.- Bonus fix: the
AuditEvent/AuditQueryFiltertypes were not exported from the package root (index.ts) at all — added for consumers who want to type their own calls toGatewayPipeline.queryAuditLog(). - Tests:
src/__tests__/sqlite-adapter.test.ts(21 tests) — the same scenario set aspg-adapter.test.ts: table listing, filtered/unfiltered queries, limits, unknown table/column rejection, injection-attempt rejection, insert (including id assignment), update, delete.
3. The MongoDB adapter
The gateway now also works with a Db instance from the mongodb driver:
- A different risk class — not SQL injection, but operator injection: for pg/mysql/sqlite the risk was a table/column name being embedded in SQL. MongoDB never embeds identifiers, but if a key in
filter/datais a Mongo operator like$where/$ne, or a value is an operator object like{ $ne: null }, the "simple key-value equality filter" a tool declares can silently turn into an arbitrary query. This adapter rejects all of the following up front:- any key starting with
$(in bothfilteranddata) - any key containing
.— a dotted path (e.g."passwordHash.reset") is both an operator-like risk and a way to bypassfindProtectedWriteFields's exact-name matching (outside of its glob support) - any non-scalar (object/array) filter value — including an operator-object bypass attempt like
{ status: { $ne: "active" } }
- any key starting with
mongodbis only an optionalpeerDependency— same as the SQLite adapter, tests were written against a mock object matching theMongoDatabaseinterface, without importing the real package.- "Table" = collection.
tables()maps tolistCollections(); insert attaches_id(the driver'sinsertedId) to the returned row; update runsupdateManywith{ $set: data }; delete runsdeleteMany. - Tests:
src/__tests__/mongo-adapter.test.ts(19 tests) — collection listing, filtered/unfiltered queries, limits, three operator-injection scenarios (a$-prefixed key, a dotted key, an operator-object value), insert/update/delete.
Quick Start
1. Connect with one click via Smithery
You can add this to Claude Desktop with one click via Smithery.
2. Connect to Claude Desktop via global install
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
Windows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:~/.config/Claude/claude_desktop_config.json
Restart Claude Desktop. The demo database loads automatically, with PII masking active.
3. Use it in your project (Prisma)
If you don't use Prisma, you can also pass a raw pg or mysql2 connection directly:
Security note: unlike the Prisma adapter, the
pg/mysql2/better-sqlite3adapters generate raw SQL. Because table and column names can't be parameterized, they are validated against the live schema on every query (information_schema, orPRAGMA table_infofor SQLite) — a table/column name that isn't in the schema (e.g. an injection attempt) is rejected before it ever reaches SQL. The MongoDB adapter guards against a different risk ("operator injection" instead of SQL) — see Recent Changes.
MCP Tools
The gateway always exposes these 5 read tools to Claude:
When writesEnabled: true (see Write Support), 3 more write tools are added:
Configuration
Masking Strategies
Glob pattern support: *Password*, *Token*, *Secret*
PII inside text columns (piiScan)
Field rules go by column name, so a free-text column (notes, description) can still carry an e-mail, a TC kimlik or an API key. piiScan (off by default) masks those by value in every text field no field rule covers, nested objects and arrays included; an allow rule turns it off for that field. preset / enable / disable pick the detectors, with the same presets as the security proxy: ALL (default), KVKK, IDENTITY, IDENTIFIERS, SECRETS.
From the CLI: GATEWAY_PII_SCAN=true (every default detector) or GATEWAY_PII_SCAN=KVKK (a preset). An unknown preset or detector name fails at startup.
piiScan.blockPatterns and piiScan.allowPatterns add your own patterns, as in the security proxy: block masks your ids as <CATEGORY_n>, allow leaves a detected value whose whole text matches. A block pattern that runs over its 100 ms budget fails the query rather than return rows it may not have masked.
Role-Based Access (RBAC)
The role is set when the server starts, via the GATEWAY_ROLE env var or config.activeRole.
Each Claude Desktop profile or deployment can run with a different role.
Rule precedence (highest to lowest):
- Global
tableRulesdeny - Role
denyTables - Role
allowTables(a whitelist — if set, the table must be in this list) - Role
fieldRules→ globalfieldRules
Write Support (write/insert/update/delete)
The gateway is fully read-only by default. Letting the LLM modify data requires deliberately unlocking a few gates:
writesEnabled: true— the global kill-switch. Whilefalse(default),insert_row/update_row/delete_roware never visible to Claude.- Table permission —
tableRules[].write.{insert,update,delete}— per table, off by default for all. - Role permission (when a role is active) —
roles[].write.{insert,update,delete}. If a role never defineswrite(undefined), write is completely off for that role — even if the table permits it. To permit a write, both the table and the role must explicitly saytrue(AND logic — deliberately stricter than the "role overrides" logic used for masking rules).
Beyond these three gates, there are two more protections that cannot be disabled:
- Protected-field guarding — the LLM can never write a value into a field marked
redact/mask/hashinfieldRules(e.g.tcKimlik,passwordHash); ifinsert_row/update_rowsees such a field indata, the whole request is rejected. maxAffectedRowsPerWrite— beforeupdate_row/delete_rowruns, the filter is first tried as a read; if the matched row count exceeds this limit (default 10), the operation is rejected before touching anything.update_row/delete_rowalso always reject an empty filter — "update/delete the whole table" is never possible through this gateway.
Every write attempt (accepted or denied) is written to the audit log; only which fields were written is logged, never data itself (so the audit log itself can't become a PII leak point).
Prisma Adapter
Pass a PrismaClient directly — table name → model mapping is automatic:
Development
License
MIT — GuardBee
Feedback
Questions, ideas, or a false positive? Start a thread in GitHub Discussions or open an issue. If GuardBee is useful to you, a ⭐ on the repository helps others find it.
來源:packages/db-gateway/README.md,提交 040e072
工具
0版本歷史
1- v0.3.5最新Sep 29, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分