jp-law-mcp
# jp-law-mcp
 
日本の行政実務者が Claude などの AI から使える、法令と国会会議録の MCP サーバーです。
条文の取得(時点指定)、改正履歴・新旧比較、本文検索、**AI が書いた文書の法令引用の実在確認**、**引用・委任の逆引き**、国会会議録の発言検索ができます。
確かめるのは国の法令(法律・政令・府省令など)の条・項・号と、国税庁の基本通達(所得税・法人税・消費税法・相続税法・財産評価)の番号の実在です。それ以外の通達・判例・条例の引用は、見つけて「確かめていない」と示します。
引用グラフ・法令名・条文の形のデータは [JLaw-CiteGraph(jlawcite)](https://github.com/yabooung/jp-law-citation-graph) から作っています。
## 使い方
試験公開中の接続先(Streamable HTTP、インストール不要):
```
https://jp-law-mcp.vercel.app/mcp
```
- **Claude(claude.ai・デスクトップ)**: 設定 → コネクタ → カスタムコネクタを追加 で上の URL を入れる
- **Claude Code**: `claude mcp add --transport http jp-law https://jp-law-mcp.vercel.app/mcp`
- **自分の PC で動かす**(stdio、Node.js 20 以降): `npx -y jp-law-mcp`
- Claude Code: `claude mcp add jp-law -- npx -y jp-law-mcp`
- Claude デスクトップなど(設定ファイル): `{"mcpServers": {"jp-law": {"command": "npx", "args": ["-y", "jp-law-mcp"]}}}`
- Claude デスクトップの拡張: [Releases](https://github.com/yabooung/jp-law-mcp/releases) の `jp-law-mcp-<版>.mcpb` を開く(macOS・Windows 版の Claude デスクトップは Node.js を内蔵しているので、別に入れなくてよい)
- 外部 API へは自分の回線から問い合わせるので、試験公開の接続先の回数制限を受けません。たくさん使う場合はこちらを勧めます
試験公開の接続先は、外部 API への負担を抑えるため、ツールの呼び出しを利用者ごとに毎分 60 件までにしています(接続の手続きは数えません)。利用者は送信元 IP で分けます。
組織のプロキシや AI サービスの中継のように多くの人が同じ送信元になる場合は、接続 URL に `?u=` と任意の文字列
(英数字・`_`・`-`、64 字まで。例 `https://jp-law-mcp.vercel.app/mcp?u=tanaka-01`)を付けると、その文字列ごとに数えます
(同じ送信元の合計は毎分 600 件まで)。認証ではないので、他人に知られても困らない文字列にしてください。
### 例
> 行政手続法第8条(理由の提示)は 2018 年 4 月 1 日時点と現在で違いがあるか。この条を引用している法令と、関連する国会での発言も教えて
AI が `compare_article`・`find_citing_provisions`・`search_diet_records` を使い、原文リンク付きで答えます。
> 部下の通知文案「本件申請は、行政手続法第8条第3項及び地方税法第999条の規定に基づき不許可とします」の法令引用を確認して
`verify_citations` が、第8条は第2項までであること、地方税法に第999条がないことを知らせます。
### よく使う手順(プロンプト)
クライアントのプロンプト一覧(Claude なら「+」や「/」のメニュー)から選べます。
| プロンプト | 内容 |
|---|---|
| `check_document` | 通知文・答弁案・AI の回答などの法令引用を確かめ、直すべき箇所と直し方を一覧にする |
| `article_at_date` | 処分・申請の日に施行されていた条文(行為時法)と、その後の改正を確かめる |
| `amendment_impact` | ある条を改正するとき、引用・準用している他の法令の条を洗い出す |
接続した AI には、法令を挙げて答えるときは答えを返す前に `verify_citations` で確かめ、条文の中身は `get_article` で原文を読んでから書くよう、サーバーから伝えています。
## ツール
| ツール | 内容 | データ源 |
|---|---|---|
| `find_law` | 法令名・略称から法令ID・種別・現行/廃止を調べる。旧題名・施行予定の改正後の題名なら、いまの法令を示す | [e-Gov 法令API v2](https://laws.e-gov.go.jp/api/2/swagger-ui/) |
| `get_article` | 条文を読む。`asof` でその日に施行されていた版(行為時法)。現行なら施行予定の改正を警告 | 同上 |
| `law_history` | 改正履歴(施行日・改正法令・現行/過去/未施行) | 同上 |
| `compare_article` | 同じ条の二つの時点の新旧比較 | 同上 |
| `search_law_text` | 本文の全文検索(空白区切り AND)。上位 3 法令はその文が第何条かも示す | e-Gov 法令API v2 `/keyword`・本文 |
| `verify_citations` | 文章中の法令引用を取り出し、法令・条・項・号の実在を確認。存在しない条・項、法令番号と名称の食い違い、架空の法令名、廃止法令を知らせ、照合用の抜粋を付ける([評価](#引用確認の評価))。`detail=true` で引用した項・号の本文を長く返す(答えの内容と突き合わせるため) | `data/structure.json.gz`・`data/law_names.json.gz` + e-Gov(1 回最大 10 件) |
| `find_citing_provisions` | **逆引き**: この条(または法令全体)を引用・委任元として参照している条文を法令ごとに。`depth=2` で間接的な影響範囲 | `data/graph.json.gz`(jlawcite から生成) |
| `find_cited_provisions` | この条が引用している条・委任先の政令省令 | 同上 |
| `search_diet_records` | 国会会議録の発言検索(立法趣旨・政府答弁の確認) | [国会会議録検索システム 検索用API](https://kokkai.ndl.go.jp/api.html) |
未対応: 附則・別表の中身の確認、基本通達以外の通達・判例・条例の実在確認(引用は見つけて「確かめていない」と示す)、法令の意味検索。
## 引用確認のしくみ(verify_citations)
1. 文章から「第N条」を探し、直前の法令名を辞書(`data/law_names.json.gz`: 正式名 <!--v:names.canonical-->8,981<!--/v-->・略称 <!--v:names.abbrev-->3,165<!--/v-->・別称 <!--v:names.alias-->177<!--/v-->・旧題名 <!--v:names.old_name-->749<!--/v-->・法令番号 <!--v:names.promulgation-->8,627<!--/v-->・施行予定の改正で変わる題名 <!--v:names.new_name-->14<!--/v-->)で決める。旧題名や改正後の題名で書いた引用もいまの法令として確かめ、そのことを注記する。題名が変わる予定の法令には、変わる日と新しい題名を添える。辞書の名前の直前に漢字が続く場合(「地方行政手続法」)は辞書の名前に読み替えず「該当なし」とする
2. 「所得税法第33条、第34条」「民法第901条第1項ただし書、第900条」のような並びは直前の引用の法令を引き継ぐ(直前の法令が分からなければ分からないことも引き継ぐ)。「同法施行令」「同施行令」「措置法施行規則」は前に出た(または頭に書いた略称の)法律の施行令・施行規則とする。法令名のない「第N条」は、同じ段落で直前に名前を書いた法令の条と**推定**し、その旨を示す。推定した法令にその条・項・号がなく、この文章で名前が出た他の法令(とその施行令・施行規則)のうちそれがあるものが一つだけなら、そちらとみなす(推定なので、条がなくても「存在しない」とは言い切らず ⚠ にする)。国税庁の資料などで使う略称(措法・措令・所法・所令・法法・消法・相法・通法・徴法 など)も読む。文章の中の略称の定め(「以下「法」という。」)、「同法」「同令」、「旧」「改正前の」(現行版では確かめない)、附則(確かめない)も読む
3. 条・項・号の有無を `data/structure.json.gz`(e-Gov スナップショット <!--v:snapshot-->2026-10-20<!--/v--> の <!--v:structure.laws-->8,981<!--/v--> 法令・<!--v:structure.articles-->243,501<!--/v--> 条の形、<!--v:structure.mb-->0.9MB<!--/v-->)で判定する
4. e-Gov API には 1 回の確認で最大 10 件だけ問い合わせる。スナップショットで「ない」と出たものを先に現行版で確かめ直し(スナップショット後の改正)、残りで「ある」ものの抜粋を取る。API が答えればそちらを優先し、答えなければスナップショットの判定を日付付きで返す
5. 国税庁の基本通達 5 種の番号(「所得税基本通達33-1の2」「法基通9-2-3」など)は、国税庁ホームページの通達から作った一覧(`data/tsutatsu.json.gz`、<!--v:notice.fetched-->2026-10-22<!--/v--> 時点)で確かめる。質疑応答事例の関係法令欄で国税庁が引用した基本通達の番号 <!--v:notice.checked-->314<!--/v--> 件のうち <!--v:notice.found-->314<!--/v--> 件(<!--v:notice.rate-->100%<!--/v-->)が一覧にあり、番号を一覧にないものに変えると <!--v:notice.injected-->310<!--/v--> 件すべてを「見つからない」とする(`eval/notice_eval.mjs`)。通達はめったに変わらないので一覧は手で時々作り直す(`scripts/export_tsutatsu.py`)
6. それ以外の通達・判例・条例・告示の引用(「措置法通達31の4-1」「最判平成5年3月11日」「東京都迷惑防止条例」など)は確かめず、「確かめていない引用」として数と一覧を返す(黙って飛ばすと、全部確かめたと読まれるため)
7. `detail=true` のときは、引用を含む文で要件として書いた数値(「5,000万円を超える」「5年以内」「6か月」「5%相当額」)を、同じ文で引用した条の本文の数値(「三千万円」「五年」「六月」「百分の五」)と比べ、同じ種類の数値が条文にあるのに値が違えば「数値の確認(参考)」を付ける。質疑応答事例の回答(国税庁の文章)で要件の数値を含む <!--v:qty.n-->54<!--/v--> 文のうち注意が付いたのは <!--v:qty.alert-->6<!--/v--> 文で、そのうち 2 文は回答の後の改正で条文の金額が変わったもの(措法第67条の5 の 30万円→40万円、第27条の 55万円→65万円)、残りは別の条・別表の数値や計算した値。条文にある数値を書き換えた文では <!--v:qty.detect-->85.4%<!--/v-->(<!--v:qty.detect_kn-->41/48<!--/v-->)に注意が付く(`eval/quantity_eval.mjs`、<!--v:qty.date-->2026-10-21<!--/v-->)
確かめるのは国の法令の条・項・号と基本通達の番号の実在、それと(detail のとき)要件の数値の食い違いの目安までで、引用した主張が条文に合っているかは判断しません。
## 引用確認の評価
国税庁「質疑応答事例」の関係法令欄と、それを条に結び付けた正解(jlawcite の `eval/v2/nta_gold.jsonl`。このツールとは別のコードで作成)で測りました。事例を id のハッシュで dev <!--v:dev.cases-->591<!--/v--> 件・test <!--v:test.cases-->595<!--/v--> 件に分け、dev だけを見て直し、test は設定を決めたあと初めて実行しました(2026-10-20)。その後は同梱データを新しいスナップショットに替えるたびに、設定を変えずに dev・test を自動で測り直しています(test の結果は直すことには使いません)。引用の読み方を直したとき(2026-10-21、「同法施行令」など)も test を一度だけ測り直しました。下の数値は e-Gov <!--v:snapshot-->2026-10-20<!--/v--> スナップショットでの測定(<!--v:test.date-->2026-10-22<!--/v-->)です。e-Gov API は呼ばず、同梱スナップショットでの判定を測っています。数値は `eval/results/`。
| | dev | **test** |
|---|---|---|
| 正解の条を取り出せた割合 | <!--v:dev.found-->100%<!--/v-->(<!--v:dev.found_kn-->1,263/1,263<!--/v-->) | **<!--v:test.found-->100%<!--/v-->(<!--v:test.found_kn-->1,261/1,261<!--/v-->)** |
| 正しい引用に警告を出した割合 | <!--v:dev.false_alarm-->0.12%<!--/v-->(<!--v:dev.false_alarm_kn-->1/844<!--/v-->) | **<!--v:test.false_alarm-->0.68%<!--/v-->(<!--v:test.false_alarm_kn-->6/881<!--/v-->)** |
| 入れた誤り(存在しない条・項、架空の法令名、法令番号の食い違い)を見つけた割合 | <!--v:dev.flagged-->100%<!--/v-->(<!--v:dev.flagged_kn-->1,464/1,464<!--/v-->) | **<!--v:test.flagged-->100%<!--/v-->(<!--v:test.flagged_kn-->1,471/1,471<!--/v-->)** |
2026-10-20・21 の測定(e-Gov 2026-09-27・2026-10-19 スナップショット)で test が警告した 6 件は、すべて租税特別措置法施行令・同施行規則の項・号でした。該当ページは「令和7年8月1日現在の法令・通達等に基づいて作成」で、スナップショットとのあいだの改正で項番号がずれたものと見ています(推定)。いまの内訳は `eval/results/verify_test.json` の `false_alarm_by_code`。古い資料の引用は `asof` で当時の版を指定して確かめてください。
**AI が書いた答えでの確認**: 上の質疑応答事例 50 問に AI(Claude Sonnet、このサーバーあり・なし)が書いた答え 100 件を使いました。問の id のハッシュで半分に分け、片方だけを見て直し(「同法施行令」の読み・同じ段落の法令の推定など)、もう片方で一度だけ測りました(<!--v:gate.date-->2026-10-21<!--/v-->)。引用 <!--v:gate.citations-->276<!--/v--> 件のうち <!--v:gate.checked-->257<!--/v--> 件(<!--v:gate.checked_pct-->93.1%<!--/v-->)を実在の判定に回せました(直す前は 85.8%)。法令名が決まらず判定しなかったものは <!--v:gate.no_name-->16<!--/v--> 件です。存在しないと出た <!--v:gate.missing-->3<!--/v--> 件は、改正前の号番号(法人税法第141条第4号)と、「同法」が文の上では別の法令を指してしまう書き方でした。推定した法令の条は、確認用の半分で手で見て 1 割弱が別の法令の条でした(推定の印を付けて返します。その後、条がある法令を選ぶよう直しました)。このサーバーを付けて答えさせた 150 件で、現行法にない条・項・号を挙げたものは「同法」「同条」が文の上では別の法令を指してしまう書き方だけで、ツールなしの 50 件では改正前の号番号が 1 件ありました(`eval/results/answer_eval.json`)。数値は `eval/results/gate_holdout.json`(`eval/gate_eval.mjs`)。
限界: 税務の資料だけで測っています。関係法令欄は整った書き方で、文の中に混ざった引用では法令名なし(ℹ)が増えます(回答本文で <!--v:test.C_info-->12.5%<!--/v-->)。誤りを入れる試験は条・項の有無をスナップショットで作っているので、確かめているのは「誤った引用を正しい法令・条に結び付けて判定に回せるか」です。
## 引用グラフ(data/graph.json.gz)
- `scripts/export_graph.py` が jlawcite <!--v:jlawcite-->2.5.0<!--/v--> の検索DBから作る。e-Gov スナップショット <!--v:snapshot-->2026-10-20<!--/v-->、本則の条から出る引用・委任 <!--v:graph.article_edges-->527,278<!--/v--> 組(条→条)と <!--v:graph.law_edges-->26,238<!--/v--> 組(条→法令)、<!--v:graph.articles-->198,330<!--/v--> 条、gzip <!--v:graph.mb-->2.6MB<!--/v-->
- 附則から出る参照と同じ条の中の参照は入れていない
- `get_article` は現行の法律の条を返すとき、その条を引用している施行令・施行規則の条をこのグラフから添える(委任先の条を記憶で書かずに選べるように)。質疑応答事例の正解で、施行令・施行規則の条とその親の法律の条がともに正解にある <!--v:sub.n-->543<!--/v--> 件のうち、親の条を読んだときの一覧に正解の条が出るのは <!--v:sub.listed-->455<!--/v--> 件(<!--v:sub.rate-->83.8%<!--/v-->)(`eval/subordinate_eval.mjs`)
- 「行政手続法第二章(申請に対する処分)(第八条(理由の提示)を除く。)」のような、他の法令の章・節・款のあとの括弧の中の条は、その法令の条として扱う(jlawcite 2.5.0 の抽出修正で直ったもの。それまでは引用元の法令自身の第八条に結び付いていた。2026-09-27 スナップショットで 962 組を追加・387 組を削除、無作為 20 件を本文と照合して全件正しい)
- 読み込みは最初に使ったときだけ(約 0.2 秒、ヒープ約 51MB)
## データ源の利用条件(2026-10-19 確認)
- **e-Gov 法令API v2**: 時点指定(`asof`)は 2017-04-01 以降のみ(それより前は API がエラー 400044)。法令は著作権法第13条で権利の目的とならない。出典「e-Gov 法令検索(デジタル庁)」を付ける
- **国会会議録 API**: 手続不要。多重リクエスト禁止、取得し終えてから数秒空ける、1 回 100 件まで、短時間での大量アクセスは遠慮。発言の著作権は発言者にあるが、公開の政治上の演説・陳述は著作権法第40条で利用可(同一著作者のものの編集は除く)。結果は抜粋とリンクだけを返す
- 外部 API への負担を抑えるための決まりは [CONTRIBUTING.md](CONTRIBUTING.md)(回数制限は公開されていないが、2026-10-20 に毎秒約 4 件を 40 秒送ったところで一時的に止められた)
## データの更新
jlawcite は毎月 e-Gov から作り直されます(Hugging Face に日付のタグ)。このリポジトリの GitHub Actions(`.github/workflows/data-refresh.yml`)が毎日それを確かめ、新しければ `data/` の 3 ファイルを同じ検索DBから作り直し、テスト・評価(dev・test)・文書の数値(`scripts/render_docs.py`)を更新してコミットします。dev の評価が前回より 0.5 ポイント以上悪くなったときは反映しません。main への push で接続先も更新されます。いまのデータの出どころは `data/SOURCE.json`。
## 開発
```bash
npm install
npm test # 単体テスト(実 API は呼ばない)
npm run build
LIVE=1 npx vitest run test/live # 実 API に数件だけ問い合わせる(手で実行するときだけ)
node eval/verify_eval.mjs --gold <jlawcite の eval/v2/nta_gold.jsonl> --split dev # 引用確認の評価(API は呼ばない)
python scripts/refresh_data.py --work work # data/ を jlawcite の最新スナップショットに(3 ファイルを同じ検索DBから。pip install jlawcite が必要)
python scripts/render_docs.py # README・DATA_LICENSE の数値と日付を data/・eval/results/ から埋める
python scripts/build_mcpb.py # Claude デスクトップの拡張(work/jp-law-mcp-<版>.mcpb)
```
## ライセンス
コード: Apache-2.0([LICENSE](LICENSE))。データ(`data/`・`eval/results/`): CC BY 4.0([DATA_LICENSE.md](DATA_LICENSE.md))。
法的な判断には e-Gov・官報の原文を確認してください。このツールの結果は確認の手がかりで、法的助言ではありません。
TDQS
Scored across 9 tools
Most tools target clearly different actions or resources, such as full-text search, article retrieval, history, citation verification, and Diet records. The main ambiguity is between find_cited_provisions and find_citing_provisions, whose names are very similar, though their descriptions clarify outgoing versus incoming citations.
The set mostly follows a verb_noun pattern: search_law_text, find_law, get_article, verify_citations, compare_article, and search_diet_records. Deviations include law_history, which is noun-only, and the mix of verbs find/get/search, but the naming remains predictable and readable.
Nine tools is well-scoped for a Japanese law research MCP server. Each tool supports a distinct legal-research operation, and there is no obvious padding.
The surface covers law lookup, article retrieval, historical versions, amendment history, citation verification, citation tracing in both directions, and Diet records. A minor gap is the lack of a tool to enumerate a law's article structure or table of contents, which can make browsing a law less direct.