mcpField
Q
quotecheck

quotecheck

本地服务
github.com/feenmile浏览器自动化02 周前更新

关于 quotecheck

quotecheck 是用于核验引文是否出现在引用来源中的 Python 库、命令行工具和 MCP 服务。它会抓取 URL、DOI 或 PubMed 摘要,并报告精确或近似匹配及其位置。

主要功能

  1. 01核对 URL、DOI 或 PubMed ID 中的引文
  2. 02报告精确匹配和近似匹配结果
  3. 03返回来源文本位置和片段
  4. 04提供命令行、Python 库和 MCP 工具
  5. 05防护不安全来源抓取

适用场景

  1. 01将文字作为直接引文呈现前进行核验
  2. 02定位网页中的引文措辞
  3. 03核对 DOI 或 PubMed 摘要中的引文
  4. 04在 AI Agent 工作流中检查引文匹配

MCP 相关

可选的 MCP 服务通过 stdio 运行,并提供 `check_quote(quote, source)` 工具。工具说明引导 Agent 核验直接引文并解读返回结果。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"feenmile-quotecheck": {
"command": "uvx",
"args": [
"quotecheck-mcp"
]
}
}
}
启动命令uvx quotecheck-mcp

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

安装包
pypiquotecheck-mcp0.1.1

工具

1

收录的工具列表 · 更新于 2 周前

参数类型必填说明
quotestring是
sourcestring是

详细介绍

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://... URL
  • doi:10.xxxx/...(通过 https://doi.org 解析,并遵循出版商的重定向)
  • pmid:12345(通过 NCBI E-utilities efetch 获取 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。

评论

支持 Markdown

第一次接触 MCP?

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

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