sqlike-mcp について
sqlike-mcpは、6種類のデータベース方言に対応したSQL静的解析とクエリ書き換えの等価性チェックを開発者に提供します。クライアントがSQLをローカルでトークン化してから転送するため、識別子とリテラルはマスクされます。
主な機能
- 01SQLの妥当性とアンチパターンの検査
- 02適用可能な書き換えとインデックスの提案
- 03クエリ結果の等価性比較
- 046種類のSQL方言への対応
- 05転送前のSQLローカルトークン化
活用シーン
- 01SQL実行前の正確性問題の検出
- 02書き換えによるクエリ結果の変化確認
- 03CIやコミット前のSQLファイル検査
MCP 対応
MCPサーバーは、SQL静的解析用の`analyze`とクエリ等価性チェック用の`diff`を提供します。クライアントはリクエスト送信前にSQLをローカルでトークン化します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
2掲載時のツール一覧 · 1 日前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| sql | string | はい | 分析する SQL クエリ。 |
| stats | string|null | いいえ | 任意指定できるテーブル行数の JSON マップ。例:`{"orders": 2000000}`。重大度は データ量に応じて変化します。大きなテーブルではパフォーマンス上の指摘の重大度が上がり、小さなテーブルでは下がってインデックスのアドバイスが削除されます。 テーブル名は送信前にトークン化され、数値は数値のまま送信されます。 |
| schema | string|null | いいえ | 列と型を考慮したチェックに使用する任意のスキーマ DDL(CREATE TABLE/CREATE INDEX)。 |
| dialect | string|null | いいえ | SQL 方言:"postgres"(デフォルト)、"mysql"、"sqlite"、"mssql"、"mariadb"、"duckdb"。 |
| explain | string|null | いいえ | 任意指定できるクエリプラン。プランナーの実際の動作に基づいてインデックス不足の指摘を確認または却下し、実際の行数も指定されている場合は、すべてのパフォーマンス上の指摘を再評価します。Postgres `EXPLAIN (ANALYZE, FORMAT JSON)`、MySQL `EXPLAIN FORMAT=JSON`、SQLite `EXPLAIN QUERY PLAN` (`.mode json` の行)、SQL Server `SHOWPLAN_XML` または `STATISTICS XML`、DuckDB `EXPLAIN (FORMAT JSON)`。識別子は送信前にトークン化されます。 |
| allow_raw | boolean | いいえ | クエリをトークン化/プライバシーマスキングできない場合(ローカルで解析できない、またはマスクできない名前を含む場合)にのみ適用されます。true に設定すると、生の SQL をサーバーに送信します。デフォルトの false では送信がブロックされます。設定する前にユーザーに確認してください。 |
詳細
sqlike:MCP サーバーと CLI
SQL を実行前にチェックし、書き換え後も同じ結果が返るか確認できます。
sqlike はクエリを読み取り、問題点を教えてくれます。妥当性エラー、アンチパターン、適用可能な書き換え、インデックスに関するアドバイスを提示します。また、2つのクエリを比較し、2つ目のクエリが引き続き同じ結果を返すかどうかを報告します。分析にモデルは一切使われないため、同じクエリには常に同じ答えが返ります。
このリポジトリには、クライアントとなるMCP サーバー、CLI、およびそれらが共有するライブラリが含まれています。SQL はローカルでトークン化されるため、識別子やリテラルはマシンの外に出る前にマスクされ、トークン化されたクエリのみが送信されます。分析エンジンはこのリポジトリには含まれていません。サーバー側で動作し、非公開です。
方言: Postgres、MySQL、MariaDB、SQLite、SQL Server、DuckDB。各ルールには、そのエンジンで測定された判定が付いているため、受け取る深刻度は Postgres から引き継いだものではなく、そのデータベースの挙動に基づきます。DuckDB は列指向型です。汎用セカンダリーインデックスがないため、10種類のインデックスアドバイザーは、DuckDB では4種類の列指向アドバイザーに置き換えられます。
理由
現在、多くの SQL は AI によって書かれていますが、生成された SQL は正しく実行されることよりも、読みやすく書かれていることのほうが多くあります。LEFT JOIN が INNER になり、行がいつの間にか消えてしまいます。WHERE が抜けて、UPDATE がすべての行に適用されてしまいます。2つのテーブルが誤ったキーで結合されてしまいます。どれも見た目では間違いに気づきにくく、実際に何かが起きるまで明らかになりません。
sqlike は、その間に入るチェックです。実際のデータベースで出荷前に検証された172のルールカタログに基づき、危険なパターンを検出し、書き換えによって結果が保たれるかを判定します。後者のチェックは健全ですが、完全ではありません。証明できる書き換えは保証し、証明できない場合は推測せずに Undecided と回答します。Undecided は決して同値を意味しません。
何も生成しないため、再試行のループも、トークンごとのコストも、同じ入力に対する実行ごとのばらつきもありません。同値性チェックは解法を求めるのではなく正規化するため、最先端の学術的証明器が数百ミリ秒かかるところを、約1ミリ秒で回答します。証明器が優位となるクエリも含めた直接比較の測定結果をご覧ください。
MCP サーバーのインストール
任意の MCP クライアント(Claude Code、Claude Desktop、Cursor など)に追加します。
{
"mcpServers": {
"sqlike": { "command": "npx", "args": ["-y", "@sqlike/mcp"] }
}
}
または、Smithery からインストールします。キーをお持ちで、より高いレート制限を利用したい場合は、SQLIKE_API_KEY を設定してください。キーがない場合は、登録不要の匿名ティアが利用できます。
ツール
analyze
1 つのクエリを静的解析し、妥当性、アンチパターン、推奨される書き換え、スキーマとインデックスに関するアドバイスを提示します。JSON 形式の解析結果を返します。
| Argument | Type | Description |
|---|---|---|
sql | string | 解析するクエリです。必須です。 |
schema | string | 列と型を考慮したチェックに使用する、任意の DDL(CREATE TABLE / CREATE INDEX)です。 |
stats | string | テーブルと行数の対応を示す任意の JSON マップです(例:{"orders": 2000000})。重大度とインデックスに関するアドバイスは、データ量に応じて変わります。 |
explain | string | 任意のクエリプランです(Postgres の EXPLAIN (ANALYZE, FORMAT JSON)、MySQL の EXPLAIN FORMAT=JSON、.mode json の行としての SQLite の EXPLAIN QUERY PLAN、SQL Server の SHOWPLAN_XML、DuckDB の EXPLAIN (FORMAT JSON))。プランナーが実際に行った処理に基づいて、インデックスに関する指摘を確認または取り消します。 |
dialect | string | postgres(デフォルト)、mysql、mariadb、sqlite、mssql、または duckdb です。 |
allow_raw | boolean | クエリの解析に失敗してトークン化できない場合にのみ使用します。生の SQL を送信して解析診断を取得します。デフォルトは false です。 |
diff
2 つのクエリが同等かどうかをチェックします。これは、LLM が自分自身による書き換えについて確実に判断できない点です。判定(Equivalent、EquivalentWithNotes、Differs、または Undecided)、信頼度、およびプロパティ(列、行、カーディナリティ、順序)ごとのレポートを返すため、単純な「はい」か「いいえ」ではなく、何が変わったかを確認できます。
| Argument | Type | Description |
|---|---|---|
sql_a | string | 元のクエリです。必須です。 |
sql_b | string | sql_a と比較する、書き換え後のクエリです。必須です。 |
schema | string | 両方のクエリの解決に使用する任意の DDL(共通のスキーマ)です。 |
dialect | string | postgres(デフォルト)、mysql、mariadb、sqlite、mssql、duckdb です。 |
CLI
ターミナルまたは CI ジョブから同じチェックを実行できます。インストールせずに実行するか、PATH に追加します。
npx -y @sqlike/cli --help
npm i -g @sqlike/cli
brew install orifisher2/sqlike/sqlike
# analyze a query — the hosted API is the default, so no flags are needed
sqlike check query.sql
# several files at once, with a schema
sqlike check migrations/*.sql --schema schema.sql
# reading from stdin, machine-readable output (one JSON record per file)
cat query.sql | sqlike check - --schema schema.sql --json
# check that a rewrite is equivalent
sqlike diff before.sql after.sql
--remote または SQLIKE_URL で接続先を指定し、--key または SQLIKE_API_KEY で認証します。
クエリの EXPLAIN 出力がある場合は、--explain plan.json で渡してください。実際のアクセスパスによって、インデックスに関する指摘を確認または取り消します。クエリやスキーマと同様に、プランはマシンの外部に送信される前にトークン化されます。
終了コードは契約事項であり、それぞれが正確に 1 つの意味を持ちます。
check | diff | |
|---|---|---|
| 0 | 問題なし、または --fail-on 以上の指摘なし | 同等 |
| 1 | --fail-on warn で警告を求めた場合の警告 | 相違あり |
| 2 | SQL が無効、または重大度の高い正確性の問題など、ブロッキングの不具合 | 判定不能 |
| 3 | 接続不能、レート制限、解析不能などの運用上の問題 | 同じ |
| 4 | 使用方法のエラー(不正なフラグ) | 同じ |
check のデフォルトは --fail-on block です。そのため、助言的な指摘があってもビルドは失敗しません。厳密にチェックするには --fail-on warn を、レポートのみを行うには never を指定してください。3 は SQL に対する判定を表すものではありません。パイプラインは「このクエリに問題がある」場合と「呼び出しが成功しなかった」場合を区別できます。
CI とコミット時
SQL を記述した場所でチェックします。どちらも CLI と同じチェックを実行し、最初にローカルでトークン化します。
GitHub Actions。 検出結果はプルリクエストの差分にインラインで表示されます。このワークフローは GitHub 独自の OIDC トークンを使ってリポジトリのオーナーとして認証するため、登録も、保存や漏えいのリスクがある API キーも必要ありません。
permissions:
id-token: write # authenticate as this repo's owner
pull-requests: read # check only the files this PR changes
contents: read # mode: diff, to read the earlier version of a file
steps:
- uses: actions/checkout@v5
- uses: orifisher2/[email protected]
with:
dialect: postgres
schema: db/schema.sql
mode: diff を設定すると、プルリクエストごとに別の問いに答えます。この書き換えによって、クエリが返す内容は変わりましたか? 変更されたファイルのみを比較し、「どちらとも証明できない」という判定でビルドが失敗することはありません。
フォークからのプルリクエストは匿名で実行されます。 GitHub はフォークが起動するワークフローに OIDC トークンを発行しないため、コントリビューターのプルリクエストはリポジトリとして認証できず、IP ごとの匿名レート制限に切り替わります。問題はなく、設定も不要です。自分のブランチでは引き続き通常どおり認証されます。このアクションは、役に立たない権限を提案するのではなく、その旨を明示します。
プルリクエスト以外では変更されたファイルの一覧がないため、changed-only は適用されず、条件に一致するすべてのファイルがチェックされます。大規模なリポジトリではレート制限に達するほどのリクエスト数になるため、その場合はアクションが警告します。
pre-commit。 コミットが確定する前に、同じチェックを実行します。
repos:
- repo: https://github.com/orifisher2/sqlike
rev: cli-v0.4.2
hooks:
- id: sqlike
args: [--dialect, postgres]
sqlike に接続できない場合はその旨を伝えてコミットを通すため、このフックがブロックするのは実際の不具合がある場合であり、接続不良が原因ではありません。
プライバシーを前提とした設計
リクエストを送信する前に、トークン化はここ、つまりお使いのマシン上で行われます。sqlike が実際のテーブル名、列名、値を目にすることはないため、漏えいするものも、学習に使われるものもありません。AI アシスタントがあなたを支援するには実際の情報が必要ですが、sqlike には必要ありません。
クエリを解析できなければトークン化もできないため、クライアントは生の SQL を送信せず、送信を拒否します。それでも送信する場合は明示的なオプトインが必要です(ツールでは allow_raw、CLI では --allow-raw)。
対象となる内容と対象外の内容については、THREAT-MODEL.md を参照してください。
このリポジトリの内容
crates/mcp:MCP サーバーのsqlike-mcp。npm では@sqlike/mcpとして公開されています。crates/cli:コマンドラインクライアントのsqlike。npm では@sqlike/cliとして公開されています。crates/client:エンジンを含まない共通フォワーダー。トークン化、API 呼び出し、トークンの復元を行います。crates/core-parse:SQL パーサー、ステージモデル、トークナイザー、結果型。packages/:プラットフォームごとのビルド済みバイナリを含む npm パッケージ。skills/:エージェントスキル。コーディングエージェントが必要に応じて自ら sqlike を使えるようにします。
詳細を見る
sqlike.com でお試しください。同値性チェッカーは、標準的な学術ベンチマークに対する公開評価に加え、最先端の定理証明器との直接比較も実施しています。sqlike.com/benchmark をご覧ください。
注意
このリポジトリは、信頼できる唯一の情報源である上流のモノレポから生成されています。問題はこちらで報告してください。コードの変更は上流で行い、こちらに反映します。
ライセンス
Apache-2.0。LICENSE を参照してください。
crates/sqlparser は sqlparser-rs のベンダーコピーで、ライセンスも Apache-2.0 です。その NOTICE ファイルには上流のバージョンと、以降に変更されたすべてのファイルが記載されています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。