mcpField
S
sqlike-mcp

sqlike-mcp

本地服务
github.com/orifisher2开发工具81 天前更新

关于 sqlike-mcp

sqlike-mcp 为开发者提供 SQL 静态检查与查询改写等价性判断,支持六种数据库方言。分析由服务端引擎执行,客户端先在本地对 SQL 标记化,避免发送真实标识符和字面值。

主要功能

  1. 01检查 SQL 有效性与反模式
  2. 02提供可应用的改写和索引建议
  3. 03比较查询结果是否等价
  4. 04支持六种数据库方言
  5. 05本地标记化 SQL 后转发分析请求

适用场景

  1. 01在 SQL 执行前发现正确性问题
  2. 02验证改写是否改变查询结果
  3. 03在 CI 或提交前检查 SQL 文件

MCP 相关

MCP 服务提供 analyze 和 diff 工具,分别用于 SQL 静态分析和查询等价性检查。客户端在发送请求前会在本地标记化 SQL。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"orifisher2-sqlike": {
"command": "npx",
"args": [
"-y",
"@sqlike/mcp"
],
"env": {
"SQLIKE_API_KEY": "<SQLIKE_API_KEY>"
}
}
}
}
启动命令npx -y @sqlike/mcp
需要配置的环境变量
SQLIKE_API_KEY密钥Optional API key for the sqlike backend (higher rate limits).

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@sqlike/mcp0.2.3

工具

2

收录的工具列表 · 更新于 1 天前

参数类型必填说明
sqlstring是要分析的 SQL 查询。
statsstring|null否可选的表行数 JSON 映射,例如 `{"orders": 2000000}`。严重性会随 数据量变化:大型表会提高性能问题的级别,小型表会降低其级别并删除 索引建议。表名在发送前会进行词元化;数字仍以数字形式传输。
schemastring|null否可选的架构 DDL(CREATE TABLE/CREATE INDEX),用于执行列和类型感知检查。
dialectstring|null否SQL 方言:"postgres"(默认)、"mysql"、"sqlite"、"mssql"、"mariadb" 或 "duckdb"。
explainstring|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_rawboolean否仅当查询无法进行词元化/隐私屏蔽时才适用——查询无法在本地解析,或包含无法屏蔽的名称。设为 true 即会将原始 SQL 发送到服务器。默认值 false 会阻止发送——设置前请先询问用户。

详细介绍

sqlike:MCP 服务和 CLI

@sqlike/mcp @sqlike/cli license

在 SQL 运行前检查它,并确认重写后返回的结果是否一致。

sqlike 会读取查询并指出其中的问题:有效性错误、反模式、可自动应用的重写,以及索引建议。它还会比较两个查询,并报告第二个查询返回的结果是否仍然相同。分析过程完全不涉及模型,因此相同的查询始终会得到相同的答案。

此代码仓库包含客户端:一个 MCP 服务、一个 CLI,以及它们共用的库。它们会在本地对 SQL 进行词法分析,因此标识符和字面量会在离开你的设备前被屏蔽,只会转发经过词法分析的查询。分析引擎不在此代码仓库中。它在服务端运行,且为闭源。

方言: Postgres、MySQL、MariaDB、SQLite、SQL Server 和 DuckDB。每条规则都带有在对应引擎上测得的判定结果,因此你看到的严重程度反映的是该数据库的实际行为,而不是从 Postgres 继承而来。DuckDB 是列式数据库:它没有通用二级索引,因此十项索引建议在此被四项列式建议取代。

为什么

如今,许多 SQL 都由 AI 编写,而 AI 写出的 SQL 往往看起来不错,实际运行却不正确。LEFT JOIN 变成了 INNER,数据行悄然消失。漏掉了 WHERE,于是 UPDATE 命中了所有行。两个表用错误的键进行了联接。这些问题从页面上看不出来,也只有在造成后果后才会显现。

sqlike 就是两者之间的检查环节。它会从包含 172 条规则的目录中标记不安全的模式,每条规则在发布前都经过真实数据库验证;它还会判断重写是否保留结果。第二项检查追求可靠而非完备:它会认证能够证明的重写;无法证明时,则会回答 Undecided,而不是猜测。Undecided 绝不代表等价。

由于没有内容是生成的,因此不存在重试循环、按 token 计费,也不会因相同输入的不同运行而产生差异。等价性检查采用规范化而非求解,因此大约只需一毫秒就能给出答案,而当前最先进的学术证明器则需要数百毫秒。相关结果已通过正面对比测试,其中也包括证明器胜出的查询。

安装 MCP 服务

将其添加到任意 MCP 客户端(Claude Code、Claude Desktop、Cursor 等):

{
  "mcpServers": {
    "sqlike": { "command": "npx", "args": ["-y", "@sqlike/mcp"] }
  }
}

也可以通过 Smithery 安装。如果你有密钥并希望获得更高的速率限制,请设置 SQLIKE_API_KEY。不设置密钥也能使用匿名层级,无需注册。

工具

analyze

对单个查询进行静态分析:检查有效性、反模式、建议的改写,以及模式和索引建议。返回 JSON 分析封装。

ArgumentTypeDescription
sqlstring要分析的查询。必填。
schemastring可选的 DDL(CREATE TABLE / CREATE INDEX),用于执行感知列和类型的检查。
statsstring可选的表到行数的 JSON 映射,例如 {"orders": 2000000}。严重程度和索引建议会根据数据量调整。
explainstring可选的查询计划(Postgres EXPLAIN (ANALYZE, FORMAT JSON)、MySQL EXPLAIN FORMAT=JSON、SQLite EXPLAIN QUERY PLAN 的 .mode json 行、SQL Server SHOWPLAN_XML、DuckDB EXPLAIN (FORMAT JSON))。根据规划器的实际操作,确认或排除索引相关发现。
dialectstringpostgres(默认)、mysql、mariadb、sqlite、mssql 或 duckdb。
allow_rawboolean仅在查询解析失败、因而无法进行分词时使用:发送原始 SQL 以获取解析诊断。默认值为 false。
diff

检查两个查询是否等价,这是 LLM 无法可靠判断自身改写是否等价的问题。返回判定结果(Equivalent、EquivalentWithNotes、Differs 或 Undecided)、置信度,以及针对各项属性(列、行、基数、顺序)的报告,让你了解具体发生了什么变化,而不只是得到一个简单的是或否。

ArgumentTypeDescription
sql_astring原始查询。必填。
sql_bstring要与 sql_a 进行比对的改写后查询。必填。
schemastring可选的 DDL,供两个查询解析(共用一个模式)。
dialectstringpostgres(默认)、mysql、mariadb、sqlite、mssql、duckdb。

CLI

可在终端或 CI 作业中执行相同的检查。无需安装即可运行,也可以将其添加到路径中:

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 传入;实际访问路径将用于确认或排除索引相关发现。查询计划与查询和模式一样,会在离开本机前进行分词。

退出代码是一份契约,因此每个代码都只表示一种确切含义:

checkdiff
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 后,它会在每个拉取请求中回答一个不同的问题:此次改写是否改变了查询的返回结果? 只比较修改过的文件,而“无法证明任一结论”的判定不会导致构建失败。

来自 fork 的拉取请求会匿名运行。 GitHub 不会向由 fork 触发的工作流颁发 OIDC 令牌,因此贡献者的拉取请求无法以你的仓库身份进行身份验证——它会改用基于 IP 的匿名速率限制。这不会导致故障,也无需进行任何配置;你自己的分支仍会正常进行身份验证。Action 会明确说明这一点,而不会建议设置无法解决问题的权限。

在拉取请求之外,没有一组已更改的文件,因此 changed-only 不适用,所有匹配的文件都会接受检查。发生这种情况时,Action 会发出警告,因为在大型仓库中,这足以触发速率限制。

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:sqlike-mcp,MCP 服务。发布到 npm 时为 @sqlike/mcp。
  • crates/cli:sqlike,命令行客户端。发布到 npm 时为 @sqlike/cli。
  • crates/client:共享的转发器,不包含引擎:进行词法分析、调用 API、还原词法分析结果。
  • crates/core-parse:SQL 解析器、阶段模型、词法分析器和结果类型。
  • packages/:npm 打包目录,内含适用于各个平台的预构建二进制文件。
  • skills/:Agent 技能,让编码 Agent 知道何时应主动使用 sqlike。

了解更多

请访问 sqlike.com 体验。等价性检查器依据标准学术基准公开评测,并与最先进的证明器进行正面对比,详见 sqlike.com/benchmark。

说明

本仓库由上游单体仓库生成;上游单体仓库是唯一事实来源。请在此处提交问题。代码更改在上游进行,然后镜像回此处。

许可证

Apache-2.0。参见 LICENSE。

crates/sqlparser 是 sqlparser-rs 的随附副本,同样采用 Apache-2.0 许可证。其 NOTICE 文件记录了上游版本,并列出了此后更改过的所有文件。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。