quotecheck について
quotecheckは、引用した文章が出典に実在するかを検証するPythonライブラリ、CLI、MCPサーバーです。URL、DOI、PubMedの抄録を取得し、完全一致または近似一致とその位置を示します。
主な機能
- 01URL、DOI、PubMed IDで引用を照合
- 02完全一致と近似一致を判定
- 03出典内の位置とテキスト断片を返却
- 04CLI、Pythonライブラリ、MCPツールを提供
- 05安全でない出典取得を防止
活用シーン
- 01直接引用として提示する前に文章を検証
- 02ウェブページ内の引用箇所を特定
- 03DOIやPubMed抄録と引用を照合
- 04AIエージェントのワークフローで引用を確認
MCP 対応
オプションのMCPサーバーはstdioで動作し、`check_quote(quote, source)`ツールを公開します。ツールの説明は、エージェントによる直接引用の確認と判定結果の解釈を案内します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
1掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| quote | string | はい | |
| source | string | はい |
詳細
quotecheck
引用された文章は、実際に出典に記載されていますか?
AI エージェント(および人)は、実在する出典を引用していても、その出典の内容を誤って伝えることがよくあります。参照先は実在するのに、主張が誤っているのです。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 は、出典から quotecheck が抽出したプレーンテキスト内の Python 文字列インデックスです(終了位置は含みません)。このテキストは 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-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) という 1 つのツールを公開します。
{
"mcpServers": {
"quotecheck": {
"command": "quotecheck-mcp"
}
}
}
スクリプトが PATH にない場合は、"command": "python", "args": ["-m", "quotecheck.mcp_server"] を使用してください。
ツールの説明では、テキストを直接引用として提示する前に呼び出すこと、また各判定結果に応じてどう対応するかをエージェントに指示しています。
安全な取得
quotecheck はモデルの出力に含まれる URL を取得するため、それらを信頼できないものとして扱います。
httpとhttpsのみを許可します。認証情報が埋め込まれた URL は拒否されます。- ホストを解決し、解決されたすべてのアドレスがパブリックであることを確認します。プライベート、ループバック、リンクローカル、マルチキャスト、予約済み、未指定のアドレス(IPv4 マップド IPv6 形式を含む)は拒否されます。その後、確認済みのアドレスに接続するため、2 回目の DNS 応答によって内部アドレスに差し替えられることはありません。
- リダイレクトのたびに同じチェックを再実行し、リダイレクトは最大 5 回までです。
- 取得全体に 15 秒の期限が適用され、本文のサイズは(宣言されたサイズ、ストリーミング中、展開後のいずれも)5 MB に制限されます。
- リクエストの識別情報には
quotecheck/0.1 (+https://feenmile.com)を使用します。 - プロキシ環境変数は使用しません。
制限事項(v0.1)
- EXACT は、テキストが見つかったことを意味するだけで、主張が真実であることを意味しません。 quotecheck は文脈、意味、または情報源の信頼性を判断しません。引用が原文どおりでも、情報源に書かれていない内容を裏付けるために使われることがあります。
- PDF は対象外です。 PDF の応答は、理由
pdf not supported in v0.1とともにSOURCE_UNAVAILABLEを返します。多くの DOI は、要旨が HTML で掲載されたランディングページに解決されますが、全文は PDF でしか読めない場合があります。 - JavaScript によるレンダリングには対応していません。 ブラウザーでテキストを生成するページは、空の内容(
SOURCE_UNAVAILABLE)または不完全な内容(NOT_FOUND)として返されます。 - ペイウォール、ログイン、Cookie ウォール、ボットのブロック。 quotecheck が確認できるのは、匿名のクライアントが見られる内容です。これらの背後にあるテキストは
NOT_FOUNDまたはSOURCE_UNAVAILABLEとして扱われますが、引用が誤っていることを意味するわけではありません。 - PubMed は要旨のみが対象です。
pmid:のチェックでは、論文全文ではなく要旨のテキストを確認します。 - 省略記号は文字どおりに扱われます。 「...」で単語を省略した引用は完全一致しません。それぞれの断片を個別に確認してください。
- HTML の抽出はシンプルです。 テキストは、スクリプト、スタイル、テンプレートを除去した標準ライブラリの HTML パーサーから取得されます。ナビゲーション、フッター、非表示の要素も含まれます。また、通常とは異なるマークアップで分割されたテキストは、画面上で読むときのようにつながらない場合があります。
- Unicode。 文字は 1 文字ずつ NFKC 正規化されます。同じアクセント付き文字でも、合成形式と分解形式で書かれている場合は完全一致しません。
- ファジー検索では、引用と共通する単語を基準にします。20,000 文字を超える引用は完全一致のみで確認されます。
- 5 MB を超えるページは、途中で切り詰めずに拒否されます。
開発
python -m unittest discover -s tests -t .
python scripts/mutation_check.py
テストはオフラインで実行されます。ローカルの http.server フィクスチャを使用します。SSRF ガードがループバックをブロックするため、テストでは特定のフィクスチャの (ip, port) ペアを quotecheck._testing.allow_loopback_endpoints で例外扱いします。このスイッチはテスト専用であり、テストで有効にしない限りオフです。2 つ目のフィクスチャサーバーは例外扱いされないため、ループバックへのリダイレクトが拒否されることをテストで確認できます。
scripts/mutation_check.py はプロジェクトを一時ディレクトリにコピーし、アドレスチェックを無効にして、テストスイートが失敗することを確認します。
ライセンス
MIT です。LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。