読み取り専用で開いたSQLiteのデータベースでも、MCPサーバーに任意のSQL(データベースへの命令文)を実行できるツールを置くと、そのツールから別のファイルを作れました。Qiitaで公開された作り方と同じ構成で検証した結果です。AIに渡すツールを「顧客を名前で探す」などの決まった検索にしておけば、この問題は起きません。
この記事でわかること
- SQLiteの
mode=roの指定は、ATTACHで追加で開いたファイルには効きませんでした - 任意のSQLを実行させるなら、ATTACHを禁止すれば別のファイルへの書き込みを防げます
- データベースをつなぐ前に、ツールの種類・読ませるデータ・AIに返す項目の3点を確かめておきましょう
MCPはAIと社内データをつなぐ標準規格
MCP(Model Context Protocol)を使うと、ClaudeやChatGPTなどのAIサービスを、外部のデータやツールと接続できます。公式サイトでは、MCPを「AIアプリのUSB-Cポート」にたとえています。2 AIと社内のシステムをつなぐ窓口(MCPサーバー)を一度作れば、AIに「A社に見積もりを送ったか」と尋ねるだけで、社内の記録を探してもらえます。
9月26日にQiitaに載った記事では、顧客とタスクのデータが入ったデータベースを、MCPでClaudeから参照する作り方を紹介しています。書き込みを防ぐ対策は2段構えです。1段目はデータベースを読み取り専用で開くこと、2段目は「顧客を名前で探す」「未完了のタスクを一覧にする」など、決まった検索だけをツールとしてAIに渡すことです。1
2段目を外して読み取り専用の設定だけにするとどうなるかを、同じ構成で試しました。
読み取り専用でも、ATTACHで別のファイルを作れた
2026年9月28日に、MCPの公式SDK(Python版 2.2.0)と、軽量データベースのSQLiteを使って検証しました。顧客3件・タスク3件の試験用データを用意し、今回の検証に限って、任意のSQLを実行できるツールを追加しています。
| 試したこと | 結果 |
|---|---|
| ①顧客を探すツールで、名前の欄にSQL文を混ぜる(SQLインジェクション) | 該当0件。SQL文としては実行されない |
| ②任意のSQLで、データを追加・削除する | エラーになり、件数は変わらない |
| ③任意のSQLで、ATTACHを使って別のファイルを開く(呼び出しのたびに接続を開くサーバー) | 空のファイルが作られた |
| ④③と同じ操作を、接続を使い回すサーバーで行う | 開いたファイルにテーブルを作り、データを書き込めた |
| ⑤接続にATTACHを禁止する設定を加える(MCPサーバーを通さず、Pythonで直接) | エラーになり、ファイルも作られない |
①は値をSQL文とは別に受け取る仕組みが、②は読み取り専用の設定が効いた結果です。ところが③と④では、読み取り専用の設定が効かない別のファイルに対して、ファイルの作成や書き込みができました。
SQLiteの mode=ro は、開くデータベースファイルを読み取り専用にする指定です。3 今回の検証では、この指定は最初に開いたファイルにしか効きませんでした。SQLiteには、同じ接続で別のデータベースファイルを追加で開くSQL文(ATTACH)があり、追加で開いたファイルは読み取り専用になりません。このため、MCPサーバーを実行しているユーザーに書き込み権限がある場所なら、AIはどこにでもファイルを作れてしまいます。
④の「接続を使い回すサーバー」とは、データベースへの接続を1本だけ開いて何度も使う作りのことです。この場合、ATTACHしたファイルは接続を閉じるまで開いたままになります。そのため、テーブルを作り、データを書き込むこともできました。
任意のSQLを実行させない
最も確実なのは、Qiitaの記事と同じく、任意のSQLを実行できるツールをAIに渡さないことです。決まった検索だけをツールとして用意し、値をSQL文とは別に受け取る仕組み(プレースホルダー)を使えば、①のとおり、AIが送った文字列はSQL文として実行されません。1 AIに与える権限を最小限にする考え方は、自律AIエージェントの設計の記事でも扱っています。
どうしても任意のSQLを実行させるなら、接続ごとにATTACHを禁止しておきましょう。この禁止は、Python標準のsqlite3モジュールの set_authorizer か setlimit を使えば数行で書けます。4 ⑤のとおり、どちらの方法でもATTACHはエラーになりました。
決まった検索に絞る構成が向くのは、AIに尋ねて顧客や対応履歴を探したい場合です。反対に、集計や分析をAIに自由に任せたい場合は、任意のSQLが必要になるので向きません。決まった集計ならツールとして用意できますが、自由に任せるなら、本番データではなくコピーで試しましょう。
MCPの公式SDKはMITライセンスのオープンソースで、無料で使えます。5 ただし、AIサービスの利用料は別にかかるので、見積もりに含めておきましょう。
データベースをつなぐ前に確かめたい3点
社内で作る場合も、開発会社に頼む場合も、次の3点を確かめておきましょう。
- AIに渡すツールは、決まった検索だけか。 任意のSQLを実行できるツールがあるなら、ATTACHを禁止する設定が入っているかを確認しておきましょう
- AIが読むのは、本番データか、コピーか。 夜間に作ったコピーを読ませれば、本番データを書き換えられる心配を減らせます。任意のSQLを実行させるなら、ATTACHの禁止も合わせて確かめておきましょう
- ツールがAIに返す項目は何か。 ツールが返した内容は、AIサービスの提供元(AnthropicやOpenAIなど)に送られます。電話番号やメモまで返す必要があるか、見直しておきましょう
会計ソフト会社が用意したMCPサーバーにつなぐ場合の設定は、freee MCPの記事にまとめています。職場でAIサービスを使うときの確認項目は、IPAが挙げる5つの対策の記事が役立ちます。
出典
- TechStudio Lab「業務DBを読み取り専用MCPにしてClaudeから参照する」(Qiita、2026年9月26日)(参照 2026-09-28)
- Model Context Protocol「What is the Model Context Protocol (MCP)?」(参照 2026-09-28)
- SQLite「Uniform Resource Identifiers」(参照 2026-09-28)
- Python ドキュメント「sqlite3 — DB-API 2.0 interface for SQLite databases」(参照 2026-09-28)
- PyPI「mcp」(2.2.0、2026年9月7日)(参照 2026-09-28)

