
Shiwake Mcp
io.github.USHIKUNDESUYOPublished by GitHub account USHIKUNDESUYOv0.3.1Updated Nov 1, 2026
Journal entry testing (JET) for accounting audits. 15 screening rules, zero dependencies.
Overview
Local MCP server that screens accounting journal entries against 15 audit rules and ranks them by risk for human review.
- What you can do
- Screen journal entries against all 15 rules and return them ordered by risk score
- Check debit/credit balance and list unbalanced entries with their differences
- Run Benford's law analysis on amounts (leading-digit distribution, MAD, chi-square)
- Group exactly matching duplicate entries and list the implemented rules with their intent
- Read entries from inline JSON or from .json/.csv files (including Japanese accounting-software export formats) inside an allowed folder
- When to use it
- Useful for auditors, accounting firms and finance teams that want an assistant to triage a general ledger and decide which journal entries to look at first, including large ledgers passed as files rather than pasted into the conversation.
- Requirements
- Node.js 20 or higher; runs as a local stdio process (npx package or cloned repository). Optional --data-dir argument or SHIWAKE_DATA_DIR variable to allow reading .json/.csv ledger files from a folder; first npx fetch needs network access.
Installation
In SourceWeft
- Open Shiwake Mcp in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
shiwake-mcp
仕訳データの一次スクリーニングを行う MCP サーバー。依存ライブラリはゼロ。
総勘定元帳から仕訳を受け取り、15個のルールを当てて、先に人間が目を通すべき順番に並べ替えて返します。監査の現場でいう仕訳テスト(Journal Entry Testing)を、AIエージェントから呼べる形にしたものです。
依存ライブラリを持たない理由
npm install で入るものが1つもありません。package.json の dependencies は空です。
会計データを扱う道具に外部依存を足すと、導入のたびに「このパッケージは何をしているのか」を説明する必要が出ます。監査法人や会計事務所のネットワークで動かすとき、その説明コストは実装の手間より高くつきます。依存がゼロなら、読むべきコードはこのリポジトリの中だけで閉じます。
MCP の stdio トランスポートは、行区切りの JSON-RPC 2.0 です。SDK を使わなくても 200 行ほどで書けます。
動かす
Node.js 20 以上が必要です。
npmの修正版0.3.1を使う
0.3.1にはJSON-RPC入力ガードを含めています。npmから取得した配布物が検査済みの候補と一致し、不正な入力3ケースの拒否と、その後の正常な初期化を確認しました。Node.js 20以上がある環境では、次のコマンドで同じ版を起動できます。
Claude Codeへの接続はclaude mcp add shiwake -- npx -y [email protected]です。Claude Desktopでは"command": "npx"、"args": ["-y", "[email protected]"]を設定します。元帳ファイルを読む場合は、引数の末尾に"--data-dir", "/path/to/ledgers"を追加し、実際のフォルダーに置き換えてください。初回の取得には通信が必要です。固定ソースから試験を再現する方法は次に示します。
入力ガードを含むGitHub版を使う
npmの配布版0.3.0には、GitHubへ追加したJSON-RPC入力ガードが含まれていません。入力形式が不正な場合にエラーを返して処理を続ける修正版は、次の固定ソースから使えます。外部ライブラリのインストールは不要です。
このcommitの公開ソースで119試験の成功を確認しています。下の接続例では、/path/to/shiwake-mcpをcloneしたフォルダーの絶対パスへ置き換えてください。Node.jsから直接起動するので、npm配布版は使いません。
MCP サーバーとして繋ぐ
上で取得したGitHub版をNode.jsから起動します。
Claude Code なら1行です。
名前の前に --scope project を付けると、プロジェクト直下の .mcp.json に書き込まれ、チームで共有できます。
Claude Desktop は設定ファイル(claude_desktop_config.json)に追記します。
WindowsのJSON設定では、パスの区切りに/を使うか、バックスラッシュを\\と2つ書いてください。
大きな元帳はファイルで渡す
数百件を超える元帳は、仕訳を会話に並べずに、ファイルのパスを渡します。仕訳を会話で渡すと、AI がそれを全部書き出すことになり、数万件では収まりません。
サーバーが読んでよいフォルダを、起動時に --data-dir で指定します(何度でも指定できます。環境変数 SHIWAKE_DATA_DIR でも指定できます)。
Claude Desktop なら "args": ["/path/to/shiwake-mcp/src/server.js", "--data-dir", "C:\\audit\\ledgers"] です。
指定したフォルダの外にあるファイルは、AI からパスを渡されても開きません。シンボリックリンクやジャンクションで外を指している場合も、たどった先で判定して読みません。
あとは「2025年度_仕訳帳.csv を screen_journals で見て」のように頼めば、ツールに file が渡ります。相対パスは、最初に指定したフォルダを起点にします。読めるのは .json と .csv(UTF-8・Shift_JIS)で、上限は 256MB です。手元の計測では、38万件(CSV 76MB)で約9秒、応答は約8万字でした。
まず手元で試す
リポジトリを clone すると、同梱のサンプルデータ(合成データ383件、既知の異常を混ぜてあります)で挙動を確かめられます。npm install は要りません。
383件が25件に絞られます。スコアは各ルールの重要度の合計で、複数のルールに同時に当たった仕訳ほど上に来ます。
ツール
どのツールも、MCP のツール注釈で「読み取り専用(readOnlyHint)・外部に触れない(openWorldHint: false)」と宣言しています。何かを書き換えたり、外のサービスに送ったりはしません。
仕訳は journals に並べて渡すか、file でファイルのパスを渡します(前節)。
screen_journals が返す個々の検出(findings)は、上位 top 件(既定 50)の仕訳に関わるものだけです。件数の集計は常に全件です。全件が必要なら allFindings: true を渡します。check_balance と detect_duplicates の一覧も、既定で 200 件までです。
入力の仕訳は、簡易形と明細形のどちらでも受けます。
消費税や複合仕訳のように行数が増えるものは、明細形で渡します。
1件でも読めない仕訳があると、既定では全体を止めて、何件目のどこが読めないかを返します。読めない行を除外して続けたいときは skipInvalid: true を渡します。除外した行は、何件目か・伝票番号・理由を添えて invalidRows に返ります。
entered_at は日付だけでも受けます。その場合は「計上日と入力日の乖離」には使い、「営業時間外の入力」には使いません。
CSV の読み方
会計ソフトから書き出した CSV を、そのまま渡せます。列名は次の候補から自動で当てます。全角と半角、空白、「(税込)」のような括弧の注記の違いは無視します。
当たらない列は columns で指定します(例: { "date": "伝票日付", "amount": "金額(税込)" })。どの列を使ったかは応答の source.columnsUsed に返るので、確かめてから結果を読んでください。
1行に借方と貸方を持つ形を前提に、伝票番号と日付が同じ行を1つの仕訳にまとめます。複合仕訳の相手に使われる「諸口」は、同じ伝票の中で借方と貸方が同額なら取り除きます。合わないときは、貸借のずれを隠さないよう残します。
日付は 2026/3/31・20260331・2026年3月31日・R8.3.31・令和8年3月31日 などを読みます。金額の桁区切りと円記号は落とし、△ と括弧は負の数として扱います(負の金額は、既定では止まります)。見出しの前に表題の行があっても、見出しの行を探して読みます。エラーと除外の位置は、CSV の何行目かで返します。
弥生会計の「弥生インポート形式」(見出しの行が無い25項目または27項目の CSV)は、1項目めの識別フラグで見分けて、列の位置で読みます。2000・2111 は1行で1仕訳、2110 から 2101 までの行を1つの仕訳にまとめます。取引日付は 20260331・2026/3/31・R08/03/31 のどれでも読みます。列の並びは、弥生会計サポート情報「仕訳データの項目と記述形式」の表に合わせています。この形式には入力日時の列が無いので、入力日時を使う3つのルール(計上日と入力日の乖離・期末後の入力・営業時間外の入力)は動きません。
ルール
前提条件はオプションで渡します。
approvalThresholds と fiscalYearEnd を渡さなければ、対応するルールは動きません。関係のないルールが空振りして偽陽性を増やすより、明示的に止まるほうがよいという判断です。
「休日の計上」は、月末日付の仕訳を既定で対象から外します。月次・期末の整理仕訳は、土日でも月末の日付で計上されることが多いためです。3月31日が日曜だった2024年3月期のような年は、外さないと期末の整理仕訳がすべて当たります。月末も含めて見る場合は exemptMonthEnd: false を渡します。
「休日の計上」は、土日に加えて日本の祝日(振替休日・国民の休日を含む、2000〜2099年)を自動で見ます。祝日は内閣府の一覧を取り込まず、祝日法の規定から計算しています。2000〜2027年の全日で、内閣府の一覧と一致することを確かめました。年末年始のような会社独自の休日は holidays で足します。日本以外の元帳に使う場合は japaneseHolidays: false を渡します。
「重複仕訳」と「稀な勘定科目の組み合わせ」は、借方・貸方それぞれの科目を並べ替えてから比べます。明細の行の順番は結果に影響しません。
「期末後の入力」は、期末日より後に入力された、期末日以前の日付の仕訳を拾います。決算整理と、締めたあとの修正がここに集まります。「計上日と入力日の乖離」は既定で30日を超えた遅れしか拾わないので、3月31日付を4月10日に入力したような短い遅れは、こちらで拾います。fiscalYearEnd と entered_at がそろっているときだけ動きます。
「取消・訂正仕訳」は、同じ金額で借方と貸方を入れ替えた仕訳が 30 日以内(reversalWindowDays)にある組を、両方に相手の伝票番号を添えて返します。1件は1組にしか入れません。期末をまたぐ組は理由にそう書き添えますが、重要度は上げません。期首の洗替仕訳も同じ形になるためです。
「摘要のキーワード」の既定の語は「修正」「訂正」「取消」「調整」「仮計上」「不明」です。descriptionKeywords で差し替えられ、空の配列を渡すと止まります。「仮」1文字は仮払金などを拾いすぎるので、既定には入れていません。
「伝票番号の欠番」は、伝票番号を頭の文字と末尾の数字に分け(JV-0382 なら JV- と 382)、頭の文字ごとに連番の飛びを探します。欠けているのは仕訳そのものなので、前後の仕訳のスコアには入れず、欠番の一覧として返します。範囲の半分以上が欠けている番号は、連番で振られていないとみなして見ません。伝票番号の無い仕訳も見ません。
ベンフォード分析について
MAD の判定境界は Nigrini, M. J. Benford's Law (Wiley, 2012) Table 5.1 の値を使っています。実務で広く引かれている値ですが、法令や監査基準が定めたものではありません。
サンプルが300件を下回る場合、結果に注記が付きます。この判定境界は大標本を前提にしているためです。
そして、ベンフォードは母集団の性質を見る道具であって、個別の仕訳を判定するものではありません。分布が崩れていても、事業の性質(単価が固定の商売、規制価格、少額取引の多い業態)で説明がつくことが普通にあります。
この道具の限界
検出は不正の証拠ではありません。 どのルールも、正当な処理を大量に拾います。重複仕訳の多くは毎月同額の定期計上ですし、期末の大口は期末に売上が立つ商売なら当たり前に出ます。
この道具がやるのは、母集団のどこから見るかを決めることだけです。検出された仕訳をどう評価するかは、依然として人の仕事として残ります。
以下は、この道具ではできません。
- 監査手続そのものの代替(十分かつ適切な監査証拠は、これでは得られません)
- 不正の有無の結論づけ
- 勘定科目の内容的な妥当性の判断
- 税務上の取扱いの判定
監査意見の形成や、税務申告の根拠として使えるものではありません。
実データの取り扱い
examples/ に入っているのは合成データです。固定シードで生成しているので、node examples/generate.js を何度実行しても同じファイルになります。
.gitignore で *.csv *.xlsx journals.json /data/ を除外しています。実際の仕訳データをコミットしないための保険です。
サーバー自体はネットワークに出ません。読むのは stdin と、起動時に --data-dir で許可したフォルダの中の .json と .csv だけです。書くのは stdout だけで、ファイルには書きません。
テスト
119件のテストが走ります。MCP サーバーのテストは、子プロセスとして起こして実際に JSON-RPC を投げる経路で書いています。
CI は Node 20 / 22 / 24 で走ります。テストのほかに、依存が増えていないこと、package-lock.json が生まれていないこと、固定シードのサンプルデータが再生成しても一致することを検査しています。依存ゼロはこのリポジトリの前提なので、人の注意ではなく CI で守っています。
解説記事
このサーバーを書いた経緯と設計の判断は、記事にしています。
ライセンス
MIT
作者
星野宇潮(公認会計士・税理士)
経歴と無料で公開した製品は、公式プロフィールにまとめています。
Source: README.md at commit ee39b6c
Tools
0Version history
4- v0.3.1LatestOct 11, 2026
- v0.3.0Sep 26, 2026
- v0.1.1Sep 24, 2026
- v0.1.0Sep 24, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts