duplicate-invoice-check について
duplicate-invoice-check は、指定された仕入先請求書の記録をバッチ単位で調べ、根拠と理由を添えた候補グループを返すローカル MCP サーバーです。結果は確認用の候補であり、重複の確定や支払い判断は行いません。ERP への接続や PDF の読み取りにも対応しません。
主な機能
- 01請求書番号による候補の照合
- 02限定的な表記ゆれの検出
- 03金額と日付によるグループ化
- 04レポートの保存・ページ表示・エクスポート
- 05データとレポートのローカル保存
活用シーン
- 01仕入先請求書のバッチから重複候補を確認
- 02照合理由と元レコードを調査
- 03根拠をページ表示または CSV に出力
- 04請求書記録をローカルで処理
MCP 対応
ローカル stdio を通じて、記録のチェック、レポートの取得と出力、ライセンス状態の操作など 8 つのツールを MCP クライアントに提供します。ホスト型エンドポイントはありません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
重複する仕入先請求書をチェックする MCP サーバー
入力された仕入先請求書の一括データを確認し、請求書番号の重複、保守的な書式の違い、または金額と請求日の一致を検出します。このローカル MCP サーバーは、グループ化したすべての証拠と、各レコードの確認が必要な正確な理由を返します。正当な請求書が、金額と日付の両方で一致することもあります。候補は、重複が確定した請求書、不正スコア、回収可能な金額、または支払いに関する判断ではありません。ERP への接続、PDF の読み取り、OCR の使用、不足している履歴の取得は行いません。
theluckystrike が作成しました。MIT ライセンス。サポート:[email protected]。
インストール
Claude Desktop: duplicate-invoice-check.mcpb v0.22.8 をダウンロードして開きます。SHA-256:181379eb6dcff3d90b55e080dd9c180f6c96802e991872865a6b0ce422b3aaea。その他のクライアントでは、以下のソースコードからの手順を使用できます。
Node.js 18 以降と MCP クライアントが必要です。無料で使用する場合、API キーやアカウントは不要です。npm パッケージは公開されていないため、ソースコードをチェックアウトしてビルドし、絶対パスを指定してください。
git clone https://github.com/theluckystrike/mcp-servers.git
cd mcp-servers
npm install
node scripts/bootstrap-timezone.mjs
npm run build --workspace @theluckystrike/mcp-license
npm run build --workspace @theluckystrike/mcp-duplicate-invoice-check
Claude Desktop:macOS では ~/Library/Application Support/Claude/claude_desktop_config.json、Windows では %APPDATA%\Claude\claude_desktop_config.json の mcpServers にこのエントリをマージします。/absolute/path をチェックアウト先に置き換えてください。
{"mcpServers":{"duplicate-invoice-check":{"command":"node","args":["/absolute/path/mcp-servers/servers/duplicate-invoice-check/dist/index.js"]}}}
Claude Code:
claude mcp add duplicate-invoice-check -- node /absolute/path/mcp-servers/servers/duplicate-invoice-check/dist/index.js
Cursor:プロジェクト内の .cursor/mcp.json または ~/.cursor/mcp.json に、次のローカルエントリを追加します。
{"mcpServers":{"duplicate-invoice-check":{"type":"stdio","command":"node","args":["/absolute/path/mcp-servers/servers/duplicate-invoice-check/dist/index.js"]}}}
VS Code:トップレベルのキー servers を含む .vscode/mcp.json を使用します。
{"servers":{"duplicate-invoice-check":{"type":"stdio","command":"node","args":["/absolute/path/mcp-servers/servers/duplicate-invoice-check/dist/index.js"]}}}
Windsurf のレガシー Cascade エージェント:Claude Desktop の mcpServers JSON を ~/.codeium/windsurf/mcp_config.json にマージします。このファイルは Cascade に適用されます。新しい Devin Local エージェントでは、別の設定方法を使用します。スタンドアロンのサーバーは、8 つのツールを公開します。
Cline:MCP Servers パネルを開き、Configure タブから Configure MCP Servers を選択します。次のエントリを設定 JSON に追加します(Cline CLI の場合、ファイルは ~/.cline/mcp.json です)。
{"mcpServers":{"duplicate-invoice-check":{"type":"stdio","command":"node","args":["/absolute/path/mcp-servers/servers/duplicate-invoice-check/dist/index.js"],"disabled":false,"autoApprove":[]}}}
これらは、このプロジェクトで使用する 6 種類のローカル stdio クライアント設定です。ホストされたエンドポイントやブラウザーチャットコネクターはありません。クライアントが node を見つけられない場合は、which node で表示される絶対パスに置き換えてください。保存後、サーバーに再接続し(Claude Desktop を完全に終了して再起動し)、license_status を呼び出してから、以下の例を実行してください。tools/list の結果だけでは、候補チェックが動作していることを確認できません。
ツール
| ツール | 入力と結果 |
|---|---|
duplicate_invoice_check | records、任意の save(false):候補の完全なグループ、重複を除いた件数、根拠となるソース情報、無料プレビュー ID。 |
report_list | 任意の offset(0)、limit(20、最大 100):保存済み UUID と件数の概要。 |
report_get | 保存済みの id:ソースレコード、グループ、理由。 |
report_page | 保存済みまたはプレビューの id、section、任意の offset、limit(最大 100)、group_id:すべての根拠を含むページ。 |
report_delete | 保存済みの id:レポートを 1 件削除し、その保存領域を再利用します。 |
report_export_csv | 保存済みまたはプレビューの id、任意の offset、limit(最大 1000):ソースレコードごとに 1 行を出力し、候補の理由とグループ ID を含めます。 |
license_status | 引数なし:オフラインのライセンスプランと購入リンク。 |
license_activate | key:オフライン Pro ライセンスを検証して保存します。 |
同じ参照番号と、正当に一致する合計金額
合成データのレコードを指定して duplicate_invoice_check を呼び出します。
{
"records": [
{"record_id":"A","entity_id":"UK-1","supplier_id":"S-9","document_type":"invoice","invoice_number":"INV-001","invoice_date":"2026-10-01","currency":"USD","total_minor":12500},
{"record_id":"B","entity_id":"UK-1","supplier_id":"S-9","document_type":"invoice","invoice_number":"INV-001","invoice_date":"2026-10-02","currency":"USD","total_minor":13000},
{"record_id":"C","entity_id":"UK-1","supplier_id":"S-9","document_type":"invoice","invoice_number":"inv /001","invoice_date":"2026-10-03","currency":"USD","total_minor":12500},
{"record_id":"D","entity_id":"UK-1","supplier_id":"S-9","document_type":"invoice","invoice_number":"SERVICE-02","invoice_date":"2026-10-01","currency":"USD","total_minor":12500}
],
"save": false
}
結果には、重複を除いた候補レコードが 4 件、グループが 3 つ含まれます。exact_reference には、日付と合計金額が異なる A/B が含まれます。normalized_reference には A/B/C が含まれ、競合するすべてのフィールドが示されます。same_amount_date には A/D が含まれます。異なる正当なサービスの請求書が同じ日付と合計金額になる可能性があるため、このグループは確認を促すものです。A は 3 つのグループに含まれますが、1 件として数えられます。損失の可能性の合計は計算されません。C を INV-1 に変更すると、先頭のゼロは意味を持つため、正規化された INV001 のグループから除外されます。
入力仕様
1~1000件のレコードを指定してください。各レコードには、一意の record_id、正確な entity_id と supplier_id、document_type(invoice または credit_note)、invoice_number、実在する日付形式 YYYY-MM-DD の invoice_date、大文字の3文字通貨コード、および正の安全な整数 total_minor が必要です。IDと請求書番号は1~160文字で、前後に空白がなく、制御文字を含まないものとします。任意の entity_label と supplier_label は表示専用のテキストで、制御文字を含まず、最大200文字です。不明なフィールドは拒否されます。
金額は通貨の最小単位による整数であり、浮動小数点数の金額は使用できません。USD 12500は$125.00を意味します。通貨コードは大文字の3文字という形式のみ検証され、外部の通貨レジストリとは照合されません。クレジットノートは正の絶対額を使用し、クレジットノート同士でのみ比較されます。金額の加算、換算、または金銭的損失としての解釈は行われません。年0000、実在しない日付、重複するレコードID、ゼロ・負数・小数・安全な整数の範囲外の金額、および上限を超えるバッチは入力エラーです。
各ルールでは、(entity_id, supplier_id, document_type, currency) が完全に一致するレコードのみをグループ化します。Entity IDとsupplier IDは大文字と小文字を区別します。類似した名前、異なるID、異なるEntityが結合されることはありません。1つのバッチに複数のEntityを含めることはできますが、それぞれ別個のスコープとして扱われます。表示ラベルは照合に影響しません。
次の3つの一致ルールは、それぞれ独立して実行されます。
exact_reference:金額や日付が異なっていても、元の請求書番号が完全に一致します。normalized_reference:ASCIIのa-zはA-Zになります。削除されるのはASCIIのスペース、ハイフン、スラッシュ、ピリオドのみです。先頭のゼロ、アクセント付き文字、すべてのUnicode文字、アンダースコア、ノーブレークスペース、Unicodeのダッシュ、文字と数字の見た目が似た文字はそのまま残ります。正規化後のキーが空の場合、一致として扱われません。same_amount_date:正の金額と請求書日付の両方が完全に一致します。このルールで一致する記録には、正当な理由があることもよくあります。
グループには、完全なメンバー情報、正確なスコープと一致キー、説明、および異なるソースフィールドが含まれます。これらは互いに重複する独立した理由であり、推移的に確定した重複クラスターではありません。candidate_record_count は、重複を除いたレコード数を数えます。no_candidates_in_supplied_batch は、指定されたレコードに対してこれらの限定的なルールで候補が見つからなかったことを意味します。支払いに安全だという意味ではありません。過去の記録がない場合や、参照番号、日付、金額が変更されている場合は、これらのルールで検出できないことがあります。保存済みのレポートが、呼び出しをまたいだ暗黙の履歴として使われることはありません。比較するレコードは、毎回すべて含めてください。
ソースレコードとレポートグループは、決定性のある順序で並べ替えられます。同じ入力レコードの順序を入れ替えても、診断結果は同一になります。この処理では、すべてのペアを生成するのではなく、キーごとにグループ化します。重複分を含め、1000件のレコードに対するメンバー数は最大3000件です。サーバーはテレメトリーの収集もネットワークリクエストも行いません。
無料のエビデンス、ページング、CSV
保存されないチェックを含め、すべてのチェックで retrieval.report_id が返されます。プレビューIDは preview:<UUID> で、現在のサーバープロセス内でのみ有効です。直近2件のプレビューは30分間利用できます。3件目のチェック、再起動、または期限切れによってプレビューが削除される場合があります。その場合は、元の無料診断を再送信してください。保存済みの UUID はディスク上に永続化されます。
report_page のセクションは records、groups、record_summaries、group_members です。next_offset が null になるまで続けてください。limit は1~100です。グループのページには概要メタデータと member_count が含まれます。section: "group_members" と正確な group_id を指定して、すべてのメンバーを読み取ってください。メンバーのページには、元のレコードがすべて含まれます。レコードはレポート内に一度だけ保存され、グループはそれぞれの正確なレコードIDを参照します。保存済みレポートの上限に達した後も、すべてのページとCSVエクスポートは無料です。
エンコード済みの受信 stdio メッセージは、SDK の10 MiB受信バッファーに収まる必要があります。レスポンスには、エスケープ後のテキストエンベロープの上限として8 MiBが適用されます。レポートがこれを超える場合は、同じ無料取得手順を含む、ページ分割された概要が明示的に返されます。現在の1000行/テキストの上限は、最悪の引用符処理を含むトランスポートテストでも、この上限に収まります。CSVはグループごとにレコードを繰り返すのではなく、レコードごとに1行を使用します。元のソースフィールド、候補フラグ、理由コード、グループIDが含まれます。数式のように解釈される先頭のテキストはエスケープされます。エクスポートはテキストを返し、呼び出し元が指定したファイル名には書き込みません。引用符処理によってレスポンスの上限を超える場合、CSVページの行数は要求された上限より少なくなることがあります。実際の next_offset が null になるまで続けてください。returned は常にそのページの行数を示します。すべてのCSVページにはヘッダーが繰り返し含まれます。ページを結合する際は、ヘッダーを1つだけ残してください。
Free と Pro
| 機能 | Free | Pro |
|---|---|---|
| すべてのチェック、ソースレコード、グループ化された理由 | 1回の呼び出しにつき最大1000レコードを含む | 同じ |
| プレビューページとCSV | 含まれる | 同じ |
| 同時に保存できるレポート数 | 3 | レポート数の上限なし |
| 保存容量の合計 | 64 MiB | 64 MiB |
| 入出力、テキスト、プレビューの安全上限 | ドキュメントに記載された同じ上限 | 同じ |
Free の上限に達した状態で save: true を指定しても、完全な診断と無料プレビューが返され、saved: false、save_error: "free_saved_report_cap"、アップグレードリンクが含まれます。保存済みレポートを削除すると、枠を再利用できます。ストレージでエラーが発生した場合も、診断は保持されます。Pro でなくなるのは保存件数の上限だけです。入力、トランスポート、プレビュー、ストレージ合計の上限は増えません。
Pro を購入:一回限り $19。全サーバー:$39 バンドル。MCP_LICENSE_KEY を設定するか、license_activate を呼び出してください。キーはオフラインで検証されます。
すべてのデータはローカルに保存されます。レポートは ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/duplicate-invoice-check/ に保存されます。XDG_DATA_HOME は絶対パスである必要があり、ディレクトリの祖先にシンボリックリンクが含まれていてはなりません。非公開のJSONファイルはアトミック書き込みとプロセス間の変更ロックを使用します。読み取り時にはソースレコードを再検証し、編集された派生結果を信頼せずにエビデンスを再計算します。ライセンスの有効化では、共有ローカルライセンス設定を書き込みます。ローカルの会計データへのアクセスとバックアップは、ご自身で管理してください。
開発
npm run build --workspace @theluckystrike/mcp-duplicate-invoice-check
npm test --workspace @theluckystrike/mcp-duplicate-invoice-check
リポジトリのルートから Docker をビルドします:docker build -f servers/duplicate-invoice-check/Dockerfile .。テストでは、実際の stdio 呼び出し、スキーマの拒否、スコープ/Unicode/ゼロのネガティブケース、独立した2000バッチのペアワイズオラクル、1000レコードをグループ化したトランスポート、ページとCSV、プロセス間の保存上限、再計算、シンボリックリンク/パスの拒否、ストレージ合計の上限を対象としています。ローカルの署名キーを使う stdio テストでは、オペレーターが既存の署名キーを持っていれば使用し、その秘密鍵がない場合はスキップされます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。