three-way-match について
three-way-match は、SKUごとに仕入先の請求書を発注書、検収済み入荷、過去の請求数量と照合するローカル MCP サーバーです。例外と根拠データを返しますが、PDF 抽出、ERP 接続、支払い承認は行いません。
主な機能
- 01SKU・単価・数量の厳密な照合
- 02検収済み入荷と過去請求の累計確認
- 03例外と元行の根拠提示
- 04レポート保存・ページ表示・CSV 出力
- 05ネットワーク通信なしのローカル照合
活用シーン
- 01検収数量を超える請求の確認
- 02合計額が一致しても見つかりにくい SKU 誤りの検出
- 03分納と過去の請求数量の確認
MCP 対応
MCP クライアントが起動するローカル stdio MCP サーバーで、請求照合、レポート管理、CSV 出力、ライセンス状態確認のツールを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
三点照合サプライヤー請求書 MCP サーバー
Claude またはその他の MCP クライアントで、サプライヤーの請求書を発注書および納品受領書と照合します。このローカルサーバーは、SKU、単価、請求数量をそれぞれ、発注書、累積受領済み納品数量、およびすでに請求済みであると申告した数量と比較します。請求書と発注書の総額が一致していても、相殺されるSKUの誤りを検出し、例外ごとに根拠となる元の値を返します。構造化された書類を入力してください。このサーバーはPDFからの情報抽出、OCR、ERPへの接続、支払いの実行、請求書の承認は行いません。
theluckystrike が開発しました。MITライセンス。サポート:[email protected]。
インストール
Claude Desktop: three-way-match.mcpb v0.22.8 をダウンロードして開いてください。SHA-256:6397928ec44ea9d5c406a66f4eb7aa9a2f34f5731bf8ef9972fadfdac882f040。その他のクライアントでは、以下のソースからの手順を使用できます。
Node.js 18以降が必要です。ソースをチェックアウトしてビルドしてください。npm パッケージは公開されていません。無料ツールの実行にAPIキーやアカウントは必要ありません。
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-three-way-match
チェックアウト内の servers/three-way-match/dist/index.js の絶対パスを使用してください。このサーバーはstdioで通信し、MCPクライアントが起動します。その代わりにHTTP URLを指定しないでください。
Claude Desktop:macOSでは ~/Library/Application Support/Claude/claude_desktop_config.json、Windowsでは %APPDATA%\Claude\claude_desktop_config.json の mcpServers にこのエントリーをマージし、/absolute/path をチェックアウト先のパスに置き換えてください。
{
"mcpServers": {
"three-way-match": {
"command": "node",
"args": ["/absolute/path/mcp-servers/servers/three-way-match/dist/index.js"]
}
}
}
Claude Code:
claude mcp add three-way-match -- node /absolute/path/mcp-servers/servers/three-way-match/dist/index.js
Cursor:同じJSONを、プロジェクト内の .cursor/mcp.json または ~/.cursor/mcp.json にマージしてください。クライアントを再起動して license_status を呼び出し、続いて以下の例を実行してください。tools/list の結果だけでは照合が検証されたことになりません。
Claude Desktopでは、three-way-match.mcpb をダウンロードして開くとインストールできます。SHA-256:6397928ec44ea9d5c406a66f4eb7aa9a2f34f5731bf8ef9972fadfdac882f040。これはローカルのstdioサーバーです。ホスト型エンドポイントはありません。
ツール
| ツール | 引数と結果 |
|---|---|
three_way_match | 発注書、納品受領書、請求書、必須の prior_invoiced、任意の save を指定します。完全なレポートと保存結果を返します。 |
report_list | 任意の offset(0)、limit(20、最大100)を指定します。保存済みのUUIDと概要を返します。 |
report_get | id を指定します。元の書類、すべての問題、SKUごとの根拠情報を返します。 |
report_page | id、section、任意の offset/limit、receipt_index/sku を指定します。すべての問題、SKUの根拠情報、元の行をページ単位で無料で返します。 |
report_delete | id を指定します。保存されたレポートを削除し、ストレージの空き枠を確保します。 |
report_export_csv | id、任意の offset/limit を指定します。通貨、ステータス、書類レベルの問題コードを含むCSVテキストを返します。大きなエクスポートはページ分割されます。 |
license_status | 引数はありません。オフラインで無料版/Proのステータスと購入リンクを返します。 |
license_activate | key を指定します。Proキーをオフラインで検証して保存します。 |
入力仕様
1 回の呼び出しにつき、PO 1 件と現在の仕入先請求書 1 件を指定します。あいまい一致はありません。SKU、仕入先、PO 参照は、大文字と小文字を区別する完全一致の文字列であり、前後の空白や制御文字を含めることはできません。伝票参照と SKU の長さは 1~120 文字です。PO、請求書、入庫伝票の参照はそれぞれ異なる必要があります。文書内または prior_invoiced 内で SKU が重複している場合や、入庫伝票の参照が重複している場合は invalid となり、曖昧な行は比較対象から除外されます。異なる入庫伝票間で同じ SKU が繰り返されるのは想定どおりであり、数量は累積されます。
数量は 0~1,000,000,000 の整数単位で指定します。PO と請求書の明細数量は正の値である必要があります。小数の数量は受け付けられません。accepted_quantity と rejected_quantity は、総数量とその内数ではなく、互いに重複しない数量です。不合格数量は、請求可能な数量を増やしません。入庫には有効な YYYY-MM-DD 形式の日付が必要です。この照合に関係する入庫のみを含めてください。日付は証拠情報であり、請求書日付による自動的な締め切りには使用されません。
すべての金額入力は、0~Number.MAX_SAFE_INTEGER(9,007,199,254,740,991)の整数の最小通貨単位で指定します。USD の場合、100 は $1.00 を表します。小数桁のない通貨では、その通貨の最小単位を使用してください。PO と請求書の両方に、3 文字の大文字の通貨コードを指定します。通貨換算や通貨コードのカタログ照合は行われません。単価は許容差なしで完全一致する必要があります。金額の積と合計には整数演算を使用します。安全な範囲を超える結果は、丸めた金額ではなく unsafe_money_arithmetic を伴う invalid になります。
invoice.total_minor は、指定された商品明細の合計です。暗黙の税、運賃、値引き、端数処理、貸方調整はありません。合意済みの料金は、価格を設定した PO/請求書の SKU と適切な入庫証拠として明示するか、調整項目を除外した商品合計を事前に算出してから呼び出してください。調整項目を省略したまま、調整分を含む請求書合計を指定しないでください。
prior_invoiced は空の場合も必須です。現在の請求書を除き、この PO に対して SKU ごとに以前に請求された累積数量をすべて指定してください。[] は過去の請求がないことを明示します。現在の請求数量と過去の請求数量の合計は、受入済み入庫数量と PO 数量の両方を超えてはなりません。レポートを保存しても、この履歴は更新されず、照合間で請求書参照の重複も検出されません。履歴が誤っている、または記載漏れがある場合、請求の重複を検出できないことがあります。レポートは証拠のスナップショットであり、会計台帳ではありません。
上限は Free と Pro で共通です。PO 明細は 1~500 行、請求書明細は 1~500 行、過去の SKU は最大 500 件、入庫は最大 100 件で、各入庫の明細は 1~500 行です。空の入庫配列は有効で、請求対象の PO SKU に対する入庫不足の例外が生成されます。空または形式不正の参照、空欄または欠落した SKU、小数、安全でない入力数値、無効な日付は、入力エラーとして拒否されます。不明な SKU は unordered_sku 例外として明示されます。
合計金額が同じでも SKU の誤りが隠れていることがあります
three_way_match を次の内容で呼び出します。
{
"po": {
"reference": "PO-1", "supplier": "Supply Co", "currency": "USD",
"lines": [
{"sku": "A", "quantity": 10, "unit_price_minor": 100},
{"sku": "B", "quantity": 10, "unit_price_minor": 100}
]
},
"receipts": [{
"reference": "GR-1", "po_reference": "PO-1", "supplier": "Supply Co", "date": "2026-10-16",
"lines": [
{"sku": "A", "accepted_quantity": 5, "rejected_quantity": 0},
{"sku": "B", "accepted_quantity": 15, "rejected_quantity": 0}
]
}],
"invoice": {
"reference": "INV-1", "po_reference": "PO-1", "supplier": "Supply Co", "currency": "USD",
"lines": [
{"sku": "A", "quantity": 10, "unit_price_minor": 100},
{"sku": "B", "quantity": 10, "unit_price_minor": 100}
],
"total_minor": 2000
},
"prior_invoiced": [],
"save": false
}
PO と請求書の合計がともに 2,000 最小通貨単位で、数量の総計も同じですが、レポートの status: "exceptions" となります。SKU A には invoiced_above_accepted(請求数量 10、受入数量 5)が発生し、SKU B には accepted_above_order(受入数量 15、注文数量 10)が発生します。請求書の単価を A は 90、B は 110 に変更しても総額は変わりませんが、unit_price_mismatch の問題が 2 件発生します。
分納でも照合できます
同じ PO を使用し、A のみを含む入庫を指定して、accepted_quantity: 4、rejected_quantity: 2 とします。請求書には A のみを記載し、quantity: 4、unit_price_minor: 100、total_minor: 400 として、prior_invoiced: [] を指定します。結果は matched になります。A は 6 単位が未納のままです。B をこの分納請求書に記載する必要はありません。2 回目の入庫が照合されると、その受入数量が加算されます。不合格数量は別個の証拠情報として扱われます。A を 2 単位請求済みの場合、prior_invoiced: [{"sku":"A","quantity":2}] を指定し、受入済みの 4 単位のうち最大 2 単位を請求してください。
レポートの読み方
matched は、提示された証拠がこれらの厳密なチェックに合格したことを意味します。支払いを承認するものではありません。exceptions は、書類の不一致、不明な SKU、領収書の欠落、受領済み数量または請求済み数量の超過、価格差、あるいは申告された請求書合計の不整合を示します。invalid は、曖昧さや計算された金額の安全性に関する問題を示します。比較を解釈する前に解決してください。領収書の PO/仕入先参照の不一致はフラグが付けられ、該当する領収書は請求の根拠になりません。
各問題には、code、severity、source、任意の sku、具体的なメッセージが含まれます。SKU ごとの並べ替え済みの各行には、PO/請求書の 1 始まりのソース行番号、発注済み数量、受領済み数量、拒否済み数量、過去および今回の請求数量、両方の単価、累計請求数量、今回の請求前の利用可能数量、未納数量、領収書の参照情報/行番号と適用フラグ、問題コードが含まれます。レポートには提示された書類がすべて保持されるため、重複行が監査証拠から消えることはありません。部分的な不足は残数量として示され、裏付けのある部分請求がそれだけで不合格になることはありません。
小さなレポートはインラインで返されます。エスケープ後の MCP レスポンスが 8 MiB を超えるレポートは、ステータス、合計、件数、ソース書類のヘッダー、report_id を含む paginated: true の概要を返します。すべての証拠は report_page で無料で参照できます。section には issues、lines、po_lines、invoice_lines、prior_invoiced、receipts、receipt_lines、line_receipts のいずれかを指定します。offset(デフォルトは 0)と limit(デフォルトは 100、最大 100)を使用し、next_offset が null になるまでページを取得してください。lines のページにはスカラー形式の証拠と receipt_count が含まれます。領収書の各項目を取得するには、正確な sku を指定して line_receipts を使用してください。receipt_lines には、元の領収書配列での 0 始まりの receipt_index が必要です。receipts のページには、書類のヘッダーと行数が含まれます。これらのセクションを組み合わせることで、すべてのソース行と計算された問題が保持されます。
保存済みレポートでは、ページの取得に永続的な UUID を使用します。また、大きな保存済みレポートに対して report_get は同じ上限付きの概要を返します。保存されていない大きなレポートは、保存上限やストレージのエラーが発生した場合も含め、preview:<UUID> ID を使用します。プロセスは、直近の大きなプレビュー 2 件を 30 分間保持します。再起動、期限切れ、または 3 件目のプレビューによって、プレビューが削除されることがあります。その場合は、元の診断を再送信して無料プレビューを再作成してください。プレビュー ID は、現在実行中のサーバープロセスに属します。基盤となる SDK では、受信する stdio メッセージのサイズも 10 MiB に制限されています。個々の行数がスキーマに収まる場合でも、エンコード済みリクエストはこのトランスポートの上限内に収める必要があります。
CSV には SKU ごとに 1 行が含まれ、正確な最小通貨単位の価格、数量、行の問題コードが記載されます。書類の問題は、付属する JSON と完全なレポートに記載されます。CSV はテキストとして返され、呼び出し元が指定した任意のパスには書き込まれません。表計算ソフトで使用できるよう、数式に見える先頭文字はエスケープされます。
同じ 8 MiB のレスポンス上限内に収まる CSV エクスポートは、インラインで返されます。上限を超えるエクスポートでは、最大 1,000 行の最初のチャンクが返され、paginated、offset、returned、total_rows、next_offset が含まれます。別の report_export_csv 呼び出しでは、その next_offset を offset として渡してください。任意の limit は 1~1,000 です。各チャンクにはヘッダーが繰り返し含まれるため、チャンクを結合するときはヘッダーを 1 つだけ残してください。
Free と Pro
| 機能 | Free | Pro |
|---|---|---|
| 完全な診断チェックと根拠資料 | すべてのチェック。PO/請求書の明細は最大 500 行 | 同じ |
| 領収書と過去の請求書のチェック | 同じ記載の上限 | 同じ |
| レポートの保存 | 一度に 3 件 | レポート数の上限なし |
| 一覧表示/取得/削除と CSV エクスポート | 含まれます | 含まれます |
save: true が Free の上限に達した場合でも、完全なレポートが saved: false、save_error: "free_saved_report_cap"、および購入ページへのリンクとともに返されます。ストレージエラーが発生した場合も、診断レポートは保持されます。保存済みレポートを削除すると、Free の空き枠を再利用できます。保存および読み込み時の保存済みレポートファイルの上限は 64 MiB です。これはストレージの整合性を保護するための制限であり、Pro の制限ではありません。
Pro を購入:一度限り $19。全サーバー:$39 のバンドル。license_activate でキーを有効化するか、MCP_LICENSE_KEY を設定してください。キーはオフラインで検証されます。
すべてのデータはローカルに保存されます。照合時にネットワークリクエストは発生しません。保存済み JSON レポートは ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/three-way-match/ に保存されます。XDG_DATA_HOME は絶対パスである必要があり、ストレージディレクトリの祖先にシンボリックリンクが含まれていてはなりません。ファイルにはアトミックリネームが使用され、変更操作ではプロセス間で共有されるロックが使用されます。レポートには商取引書類のデータが含まれます。ローカルでのアクセスとバックアップを適切に管理してください。ライセンスの有効化では、共有ローカルライセンス設定が書き込まれます。
開発
npm run build --workspace @theluckystrike/mcp-three-way-match
npm test --workspace @theluckystrike/mcp-three-way-match
テストでは、相殺される数量/価格の誤り、拒否された領収書と複数の領収書、一部入荷、明示的な過去の請求、未知および重複する SKU/参照、通貨/PO/仕入先の不一致、日付、整数の境界、Free/Pro の保存ポリシー、アトミックなストレージ、および MCP の stdio による初期化と tools/call の往復を検証します。Docker はリポジトリのルートから docker build -f servers/three-way-match/Dockerfile . を実行してビルドします。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。