Skip to main content
Glama
Brandon-35

sqlite-guard-mcp

by Brandon-35

sqlite-guard-mcp

AIエージェントにSQLiteデータベースを操作させても、信用する必要はありません。 4つのツール(schema、query、execute、audit_log)を備えたMCPサーバーで、以下の3つの保証を提供します。

  1. 読み取りは書き込みできません。 queryはCレベルでSQLITE_OPEN_READONLYとして開かれた別の接続で実行されます。偽装された書き込み(/* just checking */ UPDATE …)は正規表現では検出されません。SQLite自体によって拒否されます。検査ではなく、構造によって強制されます。

  2. 書き込みは最初にドライランされます。 executeは常にロールバックされるトランザクション内でステートメントを実行し、何が起こったか(changes、lastInsertRowid)を報告します。コミットするにはconfirm: trueを指定して再度呼び出す必要があります。エージェントは意図を2回表明しなければならず、その間にオペレーターは意図された効果を確認できます。

  3. コミットされた書き込みは追跡可能な痕跡を残します。 コミットの前に、DBファイルのスナップショットが作成されます(VACUUM INTO — WALモードでアクティブなリーダーがいる場合でもトランザクション一貫性を保証)。書き込みとその追記専用の監査行は同じトランザクションでコミットされます。監査エントリのない変更や、発生しなかった変更に対する監査エントリが生じることはありません。

なぜこれが存在するのか

私は個人財務ダッシュボードを運用しています。そのUIは意図的に読み取り専用です。画面上のすべての数値は、AIエージェントがSQL経由で編集します。このアーキテクチャは素晴らしい(フォームなし、書き込みエンドポイントなし、エージェントが帳簿を管理する)のですが、エージェントがもっともらしいUPDATEを誤ったWHERE句で実行するまでは。

このシステムを運用して得られた洞察:エージェントのSQLに必要なのは、より賢いモデルではなく、人間の運用が何十年も必要としてきたものと同じ、読み取り/書き込みの分離、計画/適用ステップ、バックアップ、そして監査ログです。このサーバーはこれら4つをMCPの背後にパッケージ化し、任意のエージェント(Claude Code、またはMCPを話すその他のもの)が任意のSQLiteファイルに対してこれらを無料で利用できるようにします。

Related MCP server: SQLite Read-Only MCP Server

クイックスタート

npm install
npm run demo        # full guardrail walkthrough on a temp DB — 10 seconds, no setup
npm test            # 10 tests: rollback semantics, backup consistency, audit atomicity

Claude Codeに組み込む:

claude mcp add sqlite-guard \
  -e SQLITE_GUARD_DB=/path/to/app.db \
  -- npx tsx src/server.ts

または対話的に検査:npx @modelcontextprotocol/inspector npx tsx src/server.ts(SQLITE_GUARD_DBが設定されている場合)

ツール

ツール

契約

schema

すべてのテーブルとそのカラム、型、主キー、行数 — エージェントの地図。

query

?パラメータを使用した読み取り専用SQL。行数制限あり(SQLITE_GUARD_MAX_ROWS、デフォルト200)。大きなテーブルでのSELECT *がエージェントのコンテキストウィンドウを圧迫するのを防ぎます。実際の件数は常に報告されます。

execute

?パラメータを使用した単一の書き込みステートメント。デフォルトはドライラン → confirm: trueでコミット(バックアップ+監査)。単一ステートメントのみ — これにより; DROP TABLEの便乗も防止します。

audit_log

コミットされたすべての書き込みの追記専用の証跡。新しい順。

設計ノート

  • ドライランは実際の実行であり、EXPLAINベースの推定ではありません。ステートメントは実際に実行され(トリガー、制約などすべて含む)、ロールバックされます。表示されるのは、コミットが行うであろうこと(発生する制約エラーを含む)です。

  • 復元はファイルコピー1つ。 バックアップは<db>-backup-<timestamp>という名前のプレーンなSQLiteファイルです。誤ったコミットからの復旧はcp+再起動で、監査行はどのスナップショットがどの書き込みより前のものかを正確に記録します。

  • エージェントからのBEGIN/COMMITは拒否されます — トランザクションのライフサイクルはガードに属します。さもないと、迷子のBEGINによって後続のステートメントが「ロールバックされた」ドライランをコミットしてしまう可能性があります。

  • 監査テーブルは意図的にqueryから読み取り可能です。 ここでは秘密よりも透明性が重要です。エージェントは自身の履歴を確認でき、オペレーターはエージェントに何をいつ変更したかを要約するよう依頼できます。

  • ステートメント分類(classify.ts)はラベル付けであり、セキュリティではありません。 監査行とエラーメッセージにタグを付けます。セキュリティ境界は接続フラグとトランザクションプロトコルです。正規表現が決定するものは、意図的な入力によって覆される可能性があります。

制限事項(正直に)

  • テーブルごとの許可/拒否リストは実装されていません(better-sqlite3はSQLiteのauthorizer APIを公開していません)。境界はデータベース単位です。エージェントに管理させたいデータベースをサーバーに指定してください。

  • VACUUM INTOにはSQLite 3.27(2019年)以降が必要です。古いビルドではファイルコピーにフォールバックしますが、これは非アクティブな場合にのみ安全です。

  • 1つのMCPサーバー=1つのデータベースファイルです。複数のファイルを扱うには複数のインスタンスを実行してください。

スタック

TypeScript · @modelcontextprotocol/sdk(stdioトランスポート) · better-sqlite3 · zod · vitest。

ライセンス

MIT © Brandon Ta

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    A
    maintenance
    Provides comprehensive SQLite database operations for LLMs with security features, transaction support, and separation of read-only and destructive operations.
    22
    174 npm
    20
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables LLM agents to query databases with read-only access, while requiring human approval for writes through a token-based confirmation system.
    6
    GPL 3.0
  • F
    license
    A
    quality
    B
    maintenance
    Enables AI assistants to query SQLite databases using plain language, with strict read-only enforcement and column-level access control to prevent damage or unauthorized data reads.
    4
    -