关于 quotecheck
quotecheck 是用于核验引文是否出现在引用来源中的 Python 库、命令行工具和 MCP 服务。它会抓取 URL、DOI 或 PubMed 摘要,并报告精确或近似匹配及其位置。
主要功能
- 01核对 URL、DOI 或 PubMed ID 中的引文
- 02报告精确匹配和近似匹配结果
- 03返回来源文本位置和片段
- 04提供命令行、Python 库和 MCP 工具
- 05防护不安全来源抓取
适用场景
- 01将文字作为直接引文呈现前进行核验
- 02定位网页中的引文措辞
- 03核对 DOI 或 PubMed 摘要中的引文
- 04在 AI Agent 工作流中检查引文匹配
MCP 相关
可选的 MCP 服务通过 stdio 运行,并提供 `check_quote(quote, source)` 工具。工具说明引导 Agent 核验直接引文并解读返回结果。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
1收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| quote | string | 是 | |
| source | string | 是 |
详细介绍
quotecheck
引文是否确实出现在来源中?
AI Agent(以及人们)经常引用真实来源,却错误表述来源中的内容:引用真实,论断有误。quotecheck 会获取引用的来源,逐字检查引文是否确实出现在其中,并告诉你位置。
$ quotecheck "Mulberry trees" "https://en.wikipedia.org/wiki/Morus_(plant)"
{
"status": "EXACT",
"char_start": 9271,
"char_end": 9285,
"similarity": 1.0,
"snippet": "Mulberry trees",
"source_final_url": "https://en.wikipedia.org/wiki/Morus_(plant)",
"reason": null
}
由 Feenmile 构建。
判定结果
| status | 含义 |
|---|---|
EXACT | 规范化空白字符、弯引号和破折号样式后,引文出现在来源文本中。匹配区分大小写。 |
NEAR | 没有完全匹配,但存在相似度 >= 0.90 的段落(difflib SequenceMatcher 比率)。snippet 保存来源中的实际措辞。 |
NOT_FOUND | 可检索文本中没有足够接近的内容。similarity 显示找到的最高分数。 |
SOURCE_UNAVAILABLE | 无法获取或读取来源;reason 说明原因。 |
char_start / char_end 是 Python 字符串索引(结束位置不包含在内),指向 quotecheck 从来源中提取的纯文本;你可以通过
quotecheck.fetch_source(source).text 获取该文本。
请仔细检查 NEAR。 NEAR 结果表示措辞有所不同。数字被更改(“43,548” 与 “43,549”)或漏掉一个“not”,相似度仍可能高于 0.90。
请将返回的 snippet 用作引文,或改写为转述。
来源
https://...或http://...URLdoi:10.xxxx/...(通过 https://doi.org 解析,并遵循出版商的重定向)pmid:12345(通过 NCBI E-utilitiesefetch获取 PubMed 摘要,纯文本)
安装
PyPI 发行包名为 quotecheck-mcp;导入包和命令仍为 quotecheck。
pip install quotecheck-mcp # library + CLI, no dependencies
pip install "quotecheck-mcp[mcp]" # also the MCP server (needs the official mcp SDK)
Python 3.10 或更高版本。
快速开始:CLI
quotecheck "<quote>" <source>
quotecheck "the exact words" doi:10.1371/journal.pone.0000308
quotecheck --strict "the exact words" pmid:33301246 # exit 1 unless EXACT
echo "a long passage" | quotecheck - https://example.org/article
python -m quotecheck --help
输出始终为 stdout 上的 JSON。打印判定结果时退出状态为 0(使用 --strict 时,除 EXACT 外为 1);对于引文为空等用法错误,退出状态为 2。
快速开始:库
import quotecheck
result = quotecheck.check("pmid:33301246", "A total of 43,548 participants underwent randomization")
print(result.status, result.char_start, result.char_end, result.similarity)
print(result.to_dict())
# Already have the text? Skip the fetch.
quotecheck.check_text(text, quote, near_threshold=0.90)
核心库仅使用 Python 标准库。
快速开始:MCP 服务
该服务通过 stdio 使用 MCP,并公开一个工具 check_quote(quote, source)。
{
"mcpServers": {
"quotecheck": {
"command": "quotecheck-mcp"
}
}
}
如果脚本不在你的 PATH 中,请使用 "command": "python", "args": ["-m", "quotecheck.mcp_server"]。
工具描述会告知 Agent 在将文本作为直接引文呈现之前调用该工具,并说明如何处理每种判定结果。
安全抓取
quotecheck 会抓取来自模型输出的 URL,因此会将它们视为不可信内容:
- 仅允许
http和https;拒绝包含嵌入式凭据的 URL; - 解析主机,并要求所有解析出的地址均为公有地址:拒绝私有、环回、链路本地、多播、保留和未指定地址(包括 IPv4 映射的 IPv6 地址形式);随后连接到已检查的地址,因此第二个 DNS 响应无法将连接切换到内部地址;
- 每次重定向都会再次执行相同检查,最多允许 5 次重定向;
- 整个抓取过程共用 15 秒的截止时间,正文上限为 5 MB(包括声明大小、流式读取大小和解压后大小);
- 请求使用以下身份标识:
quotecheck/0.1 (+https://feenmile.com); - 不使用代理环境变量。
限制(v0.1)
- EXACT 表示文本确实出现过,而非所述内容属实。 quotecheck 不判断上下文、含义或来源是否可靠。引文可能一字不差,但仍可能被用来支持来源中没有提到的内容。
- 不支持 PDF。 PDF 响应会返回
SOURCE_UNAVAILABLE,原因是pdf not supported in v0.1。许多 DOI 会解析到摘要为 HTML 的落地页;全文可能仅以 PDF 格式提供。 - 不支持 JavaScript 渲染。 在浏览器中生成文本的页面会返回空内容(
SOURCE_UNAVAILABLE)或不完整内容(NOT_FOUND)。 - 付费墙、登录墙、Cookie 墙和机器人拦截。 quotecheck 只能看到匿名客户端所能看到的内容。被这些机制拦截的文本会显示为
NOT_FOUND或SOURCE_UNAVAILABLE,但这并不意味着引文有误。 - PubMed 仅检查摘要。
pmid:检查的是摘要文本,而不是论文全文。 - 省略号按字面处理。 使用 "..." 跳过部分文字的引文无法完全匹配;请分别检查每个片段。
- HTML 提取方式简单。 文本由标准库 HTML 解析器提取,并移除脚本、样式和模板。导航栏、页脚和隐藏元素也会包含在内;分散在特殊标记中的文本可能不会像屏幕上那样连在一起。
- Unicode。 字符会逐个进行 NFKC 规范化;同一个带重音字母如果分别使用组合形式和分解形式书写,将无法完全匹配。
- 模糊搜索以引文中共有的词为锚点。超过 20,000 个字符的引文仅检查精确匹配。
- 超过 5 MB 的页面会被拒绝,而不会截断。
开发
python -m unittest discover -s tests -t .
python scripts/mutation_check.py
测试在离线环境中运行,使用本地的 http.server 测试夹具。由于 SSRF 防护会拦截环回地址,测试会通过 quotecheck._testing.allow_loopback_endpoints 对特定的 (ip, port) 对解除限制;这是一个仅供测试使用的开关,除非测试将其开启,否则默认关闭。第二个测试夹具服务器始终不会解除限制,因此测试可以验证重定向到环回地址会被拒绝。
scripts/mutation_check.py 会将项目复制到临时目录、禁用地址检查,并确认测试套件会失败。
许可证
MIT。请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。