0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MCP Toolbox for Databases入門 — SQLiteをMCPサーバー化する

0
Posted at

はじめに

AIエージェントにデータベースを触らせたいとき、毎回専用のツール関数を書くのは手間がかかります。Google製のOSS「MCP Toolbox for Databases」は、YAML1本でSQL文をMCPツール化できるサーバーです。この記事では実際にバイナリを取得し、SQLiteデータベースに対してツールを定義・起動・MCP標準エンドポイントでの呼び出しまでを検証した記録をまとめます。

この記事で学べること

  • MCP Toolbox for Databasesのインストールから起動までの最短手順
  • tools.yaml でSQL文をMCPツール定義に変換する書き方
  • MCP標準のJSON-RPCエンドポイントでツールを直接呼び出して動作を確認する方法

対象読者

  • Claude Code / Codex などのコーディングエージェントにDBアクセスを持たせたい方
  • MCPサーバーを自作する前に、既存のOSSで要件を満たせるか確認したい方

前提環境

  • Linux(クラウドの検証環境。amd64)
  • Python 3.11系(sqlite3 標準ライブラリのみ使用)
  • ネットワーク(公式バイナリ配布元へのアクセス)

TL;DR

  • MCP Toolbox for DatabasesはGoogle製・Apache 2.0ライセンスのOSSで、SQLite・PostgreSQL・BigQuery・Spannerなど15種類以上のデータベースに対応する
  • tools.yaml に sources(接続先)と tools(SQL文)を書くだけでMCPツールが定義できる。コード実装は不要
  • 実際にv1.6.0のバイナリでSQLiteデータベースへ接続し、MCP標準のJSON-RPCエンドポイント(/mcp/{toolset})経由で tools/list と tools/call を呼び出したところ、いずれも期待通りの結果が返った
  • ドキュメントの一部コマンド例(--tools-file フラグ、/api/* エンドポイント)は検証時点で非推奨・無効化されており、実機で動かして初めて気づけた差分だった

MCP Toolbox for Databasesとは

MCP Toolbox for Databasesは、AIエージェントやIDEをデータベースに接続するためのMCPサーバーです。もともと「Gen AI Toolbox for Databases」としてMCP登場以前から開発が始まり、その後MCP互換に合わせて googleapis/mcp-toolbox へ改名されました1。

最新の安定版は v1.6.0(2026年7月1日リリース)で、Apache 2.0ライセンスの下、AlloyDB・BigQuery・Cloud SQL・Spanner・Firestoreといった Google Cloud 系データベースに加え、PostgreSQL・MySQL・MariaDB・SQL Server・Oracle・MongoDB・Redis・Elasticsearch・CockroachDB・ClickHouse・Neo4j・Snowflakeなど15種類以上のデータベースに対応しています2。

一般的なMCPサーバー自作では「SQL文の実行」「パラメータのバリデーション」「接続プーリング」をコードで書く必要がありますが、MCP Toolboxは tools.yaml という設定ファイルにSQL文とパラメータ定義を書くだけでMCPツールが生成される点が特徴です。

実装:SQLiteをMCPツール化する

ステップ1: バイナリの取得

公式ドキュメントに従い、Linux amd64向けのv1.6.0バイナリをダウンロードします3。

curl -sL -o toolbox \
  "https://storage.googleapis.com/mcp-toolbox-for-databases/v1.6.0/linux/amd64/toolbox"
chmod +x toolbox
./toolbox --version

検証環境で実行したところ、以下のバージョン文字列が返りました。

toolbox version 1.6.0+binary.linux.amd64.35c13ad

Goのシングルバイナリなので、依存関係のインストールなしにそのまま実行できます。

ステップ2: 検証用SQLiteデータベースの作成

Pythonの sqlite3 標準ライブラリで、検証用のテーブルとレコードを用意します。

import sqlite3
conn = sqlite3.connect('demo.db')
cur = conn.cursor()
cur.execute("CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT, tag TEXT, likes INTEGER)")
cur.executemany("INSERT INTO articles (title, tag, likes) VALUES (?, ?, ?)", [
    ("Hermes Agent入門", "OpenSource", 72),
    ("TurboQuant 8倍高速化", "OpenSource", 41),
    ("Zerostack実測", "CLI", 9),
])
conn.commit()
conn.close()

ステップ3: tools.yaml でツールを定義する

sources(接続先データベース)と tools(公開するSQL文)を1つのYAMLに書きます。パラメータ付きのSQL文も parameters で定義できます。

sources:
  my-sqlite-db:
    kind: sqlite
    database: /tmp/demo.db
tools:
  list-articles:
    kind: sqlite-sql
    source: my-sqlite-db
    description: List all articles in the demo database.
    statement: SELECT * FROM articles;
  search-by-tag:
    kind: sqlite-sql
    source: my-sqlite-db
    description: Search articles by tag name.
    parameters:
      - name: tag
        type: string
        description: The tag to search for.
    statement: SELECT * FROM articles WHERE tag = ?;
toolsets:
  demo-toolset:
    - list-articles
    - search-by-tag

kind: sqlite-sql がSQLite用のツール種別で、statement にプレースホルダ(?)を書き、対応する parameters を定義するとMCPツールの引数として公開されます。

ステップ4: サーバー起動

設定ファイルは --config フラグで渡します(--tools-file は検証時点で非推奨フラグになっていました)。

./toolbox --config /tmp/tools.yaml --port 5435

起動ログは以下の通りです。バージョン文字列・埋め込みモデル数・プロンプトセットまで表示され、旧バージョンより情報量が増えていました。

INFO "Starting MCP Toolbox for Databases version 1.6.0+binary.linux.amd64.35c13ad"
INFO "Initialized 1 sources: my-sqlite-db"
INFO "Initialized 0 authServices: "
INFO "Initialized 0 embeddingModels: "
INFO "Initialized 2 tools: search-by-tag, list-articles"
INFO "Initialized 2 toolsets: default, demo-toolset"
INFO "Initialized 0 prompts: "
INFO "Initialized 1 promptsets: default"
WARN "wildcard (*) allows any website to access the resources. ...Recommended to use --allowed-origins..."
WARN "wildcard (*) hosts allow any domain to access this resource...For improved security, use the --allowed-hosts flag..."
INFO "Server ready to serve!"

起動時に --allowed-origins / --allowed-hosts を指定しないとオリジン・ホストがワイルドカード許可になる旨のセキュリティ警告が出ます。ローカル検証では無視できますが、本番運用では指定必須と読み取れます。

ステップ5: MCP標準エンドポイントでツールを呼び出す

ドキュメントの一部ページには /api/tool/{name}/invoke というREST風のエンドポイント例が残っていますが、実際にv1.6.0で叩くと以下が返り、無効化されていることが分かりました。

curl -s -X POST http://127.0.0.1:5435/api/tool/list-articles/invoke \
  -H "Content-Type: application/json" -d '{}'
{"status":"Gone","error":"/api native endpoints are disabled by default. Please use the standard /mcp JSON-RPC endpoint"}

エラーメッセージの指示通り、MCP標準のJSON-RPC 2.0エンドポイント /mcp/{toolset名} を使います。まず tools/list でツール一覧を取得します。

curl -s -X POST http://127.0.0.1:5435/mcp/demo-toolset \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
{"jsonrpc":"2.0","id":1,"result":{"tools":[
  {"name":"list-articles","description":"List all articles in the demo database.","inputSchema":{"type":"object","properties":{},"required":[]},"annotations":{"readOnlyHint":false,"destructiveHint":true}},
  {"name":"search-by-tag","description":"Search articles by tag name.","inputSchema":{"type":"object","properties":{"tag":{"type":"string","description":"The tag to search for."}},"required":["tag"]},"annotations":{"readOnlyHint":false,"destructiveHint":true}}
]}}

続いて tools/call で search-by-tag に {"tag":"CLI"} を渡すと、WHERE tag = ? の絞り込みが正しく効いて該当する1件だけが返りました。

curl -s -X POST http://127.0.0.1:5435/mcp/demo-toolset \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"search-by-tag","arguments":{"tag":"CLI"}}}'
{"jsonrpc":"2.0","id":2,"result":{"content":[
  {"type":"text","text":"{\"id\":3,\"title\":\"Zerostack実測\",\"tag\":\"CLI\",\"likes\":9}"}
]}}

SQLインジェクション対策として、statement のプレースホルダにパラメータをバインドする方式のため、tag に任意のSQL文字列を渡してもエスケープされる設計です。

著者視点の発見ポイント

tools.yaml の statement はSQL文をほぼそのまま書けるため、既存のレポート用クエリや運用スクリプトのSELECT文を移植するだけでMCPツール化できる手軽さが、実際に触って確認できた最大の利点でした。一方で、公開されているドキュメントページの中には --tools-file フラグや /api/tool/{name}/invoke エンドポイントを紹介したままのものがあり、実際にv1.6.0で叩くと --tools-file は非推奨警告、/api/* は Gone エラーで弾かれました。ドキュメントのバージョンとバイナリのバージョンにずれがあり得る点は、実機検証をせずに記事や設定を書くと踏みやすい落とし穴だと感じました。MCP標準の /mcp/{toolset} エンドポイントさえ押さえておけば、REST風のショートカットが変わってもツール呼び出し自体は安定して動く、という設計思想が見えたのも収穫です。

まとめ

  • MCP Toolbox for DatabasesはSQL文とパラメータ定義をYAMLに書くだけでMCPツール化できるGoogle製OSS(Apache 2.0)
  • Goのシングルバイナリで依存関係インストール不要。SQLiteのようなファイルベースDBでも同じ手順で動く
  • v1.6.0では --tools-file が非推奨、--config を使う。REST風の /api/* はデフォルト無効で、MCP標準の /mcp/{toolset} JSON-RPCエンドポイントが正規の呼び出し方法
  • パラメータはプレースホルダにバインドされるため、素朴なSQLインジェクション対策も設計に組み込まれている

参考リンク

  1. MCP Toolbox for Databases(GitHub) — リポジトリ説明・改名の経緯 ↩

  2. Introduction | MCP Toolbox for Databases — バージョン・対応データベース一覧・ライセンス(2026年7月時点) ↩

  3. Local Quickstart | MCP Toolbox for Databases — バイナリインストール手順・ダウンロードURL ↩

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?