読み取り専用で開いたSQLiteのデータベースでも、MCPサーバーに任意のSQL(データベースへの命令文)を実行できるツールを置くと、そのツールから別のファイルを作れました。Qiitaで公開された作り方と同じ構成で検証した結果です。AIに渡すツールを「顧客を名前で探す」などの決まった検索にしておけば、この問題は起きません。

この記事でわかること

  • SQLiteの mode=ro の指定は、ATTACHで追加で開いたファイルには効きませんでした
  • 任意のSQLを実行させるなら、ATTACHを禁止すれば別のファイルへの書き込みを防げます
  • データベースをつなぐ前に、ツールの種類・読ませるデータ・AIに返す項目の3点を確かめておきましょう
この記事の目次(4節)
  1. MCPはAIと社内データをつなぐ標準規格
  2. 読み取り専用でも、ATTACHで別のファイルを作れた
  3. 任意のSQLを実行させない
  4. データベースをつなぐ前に確かめたい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つの対策の記事が役立ちます。

出典

  1. TechStudio Lab「業務DBを読み取り専用MCPにしてClaudeから参照する」(Qiita、2026年9月26日)(参照 2026-09-28)
  2. Model Context Protocol「What is the Model Context Protocol (MCP)?」(参照 2026-09-28)
  3. SQLite「Uniform Resource Identifiers」(参照 2026-09-28)
  4. Python ドキュメント「sqlite3 — DB-API 2.0 interface for SQLite databases」(参照 2026-09-28)
  5. PyPI「mcp」(2.2.0、2026年9月7日)(参照 2026-09-28)

任せる

AI秘書に任せる

問い合わせの受付から請求書の作成までの業務を、AIで自動化します。

できることを見る 相談する(初回無料・30分)