houki-egov-mcp
日本の法令(憲法・法律・政令・省令・規則)を e-Gov 法令 API v2 経由で取得する MCP サーバーです。 条文をキーワード・略称・分野で検索し、特定の条・項・号を Markdown または JSON で取り出し、改正履歴を引けます。
- npm:
@shuji-bonji/houki-egov-mcp(0.21.0) - リポジトリ: shuji-bonji/houki-egov-mcp
- 動作環境: Node.js 22 以上
ツール
引数の詳細と実測の呼び出し例はツールのページに、ツールが何をし、何を扱わないかは仕様書ページにあります。一覧はツールリファレンスにもあります。
| ツールのページ | 一言 | 仕様書ページ |
|---|---|---|
search_law | 法令名でキーワード検索します。略称(「法人税法」「個情法」)は正式名に解決してから検索します | 仕様 |
get_law | 条・項・号の単位で本文を取得します。Markdown / JSON / 目次のみ、を選べます。枝番号の号は item: "8の2" のように文字列で指定します(v0.6.0 から) | 仕様 |
get_toc | 目次だけを取得します。長い法令で本文を読む前に構造を掴むためのものです | 仕様 |
get_law_range | 編・章・節・款・目のいずれか、または附則 1 本を範囲にして、その中の条を本文ごと取得します | 仕様 |
get_law_revisions | 改正履歴(公布日・施行日・状態)を取得します | 仕様 |
search_fulltext | 条文本文を横断して全文検索します。ローカル DB が必要で、無いときは search_law の結果を source: "api-fallback" として返します | 仕様 |
resolve_abbreviation | 略称が正式名と法令 ID にどう解決されるかを診断します | 仕様 |
explain_law_type | 法令の種別(憲法・法律・政令・省令・通達など)と、それぞれの拘束力を説明します | 仕様 |
get_related_laws | 法令名から施行令・施行規則(施行令からは親の法律)を、e-Gov に実在するものだけ law_id 付きで返します。名前の末尾に「施行令」「施行規則」を付けた候補だけを試します(v0.10.0 から) | 仕様 |
get_article_references | 条文本文が引いている他法令の条(law_id 付き)、同一法令内の条・項・号、「政令で定める」の委任先を取り出し、get_law の引数を next_actions に付けます。「前項」「同法」は解決しません(v0.10.0 から) | 仕様 |
verify_citations | LLM が組み立てた法令の引用の一覧を、1 回の呼び出しでまとめて実在確認します | 仕様 |
list_attachments | 法令に付いている添付ファイル(別表・様式・別記の図)の一覧を返します | 仕様 |
get_attachment | 添付ファイル 1 件か、その法令履歴の添付ファイルをまとめた zip の URL を返します。save: true のときはファイルを保存して絶対パスを返します | 仕様 |
get_law_file | 法令本文を 1 つのファイル(xml / json / html / rtf / docx)で取る URL を返します。save: true のときはファイルを保存して絶対パスを返します | 仕様 |
全文検索のためのローカル DB
search_fulltext は、e-Gov が配布する全法令の一括データを手元の SQLite(FTS5)に取り込み、そこを検索します。 この DB は、公式の配布データの写しと、その全文検索の索引です。原本は e-Gov 側にあります。
早見表
| 項目 | 内容 |
|---|---|
| 取得元 | e-Gov が配布する全法令の一括データ(zip 約 290 MB)を 1 本。ほかの 13 ツールは e-Gov 法令 API v2 をその場で呼びます |
| DB ファイル | ${XDG_CACHE_HOME:-~/.cache}/houki-egov-mcp/laws.db(HOUKI_EGOV_DB_PATH で変えられます。コマンドライン引数での指定はありません) |
| テーブル | laws articles revisions_meta sync_state。全文検索の索引は laws_fts articles_fts(FTS5 trigram) |
| 鮮度の持ち方 | DB 全体で 1 つ(sync_state は 1 行)。--status で確かめられます |
| 更新の粒度 | 日ごとの差分(--sync、v0.8.0+)。最終同期日から今日までの日次差分 zip を順に取り込みます。全件の再実行でも版ごとに content_hash を比べ、変わった版だけ入れ直します |
| DB が要るツール | 14 のうち 1(search_fulltext)。DB が無いと法令名の一致で返り、source: "api-fallback" が付きます |
| 版が上がったとき | 0.19.0 で DB の版を 3 にしました。0.18.x 以前に作った DB は --bulk-download-everything で作り直します。作り直した DB を 0.18.x 以前で開くと全テーブルが消えます(版をまたぐときの注意) |
各項目の詳細は以下の各節にあります。DB を作る・最新にする・作り直す流れは次のとおりです。
ローカル DB を作っていないとき
search_fulltext は呼べて、応答も返ります。ただし、返ってくるものが条文の全文検索の結果ではなくなります。
| ローカル DB | search_fulltext が返すもの |
|---|---|
| ある | 条文の本文を横断した全文検索の結果。ヒットごとに条番号・snippet・score・freshness が付きます |
| 無い | search_law と同じ法令名の一致の結果。source: "api-fallback" が付き、next_actions に DB の作り方が入ります |
ほかの 13 ツール(search_law・get_law・get_toc・get_law_range・get_law_revisions・resolve_abbreviation・explain_law_type・get_related_laws・get_article_references・verify_citations・list_attachments・get_attachment・get_law_file)は e-Gov 法令 API をその場で呼ぶので、DB の有無に関係なく同じように動きます。
作り方
npx -y @shuji-bonji/houki-egov-mcp@latest --bulk-download-everything全法令の zip(約 290 MB)を 1 本取得して取り込みます。進み具合は標準エラー出力に出ます。 書き込むのはこの CLI だけで、MCP サーバーは読むだけなので、取り込み中に検索しても壊れません。
最新にする
npx -y @shuji-bonji/houki-egov-mcp@latest --syncsync_state の最終同期日から今日までの日次差分 zip(1 日分は数十 KB〜30 MB)を日付順に取り込みます(v0.8.0+)。 実測では、12 日ぶんの差分(341 件)を 2 分 50 秒で取り込めました(2026-09-19、全件取り込み後の DB に対して)。 差分が無い日(土日など)は飛ばし、途中で失敗しても成功した日までを記録するので、再実行すると続きから同期します。 最終同期から 90 日を超えて空いているときは、e-Gov の日次差分の公開範囲を超えるため、何もせずに --bulk-download-everything を促します。 --status の days_since_sync が 0 でないときに実行してください。
元データが変わったときに何が起きるか
法令が改正されると、e-Gov の配布データにその法令の新しい版が入ります。 --sync はその日の差分 zip から新しい版を取り込み、同じ法令の施行日が前の版を PreviousEnforced にします。 --bulk-download-everything を実行し直す場合も、版ごとに content_hash を比べて、変わった版だけを入れ直します。 中身が同じ版でも、未施行だった版が施行済みとして届いたときは、版の状態だけを書き換えます(v0.19.1 から。下の「施行日の当日に状態が変わる版」)。
古い版の行は DB に残りますが、検索には出ません。 search_fulltext は current_revision_status = 'CurrentEnforced' OR remain_in_force = 1 で現行の版に絞るためです。 過去の版を見たいときは、get_law_revisions で改正履歴を引いてください。
施行日の当日に状態が変わる版
e-Gov は、改正が公布された日の差分に、施行日ごとの版を未施行として入れます。施行日の当日の差分には、同じ版を同じ中身のまま、施行済みとしてもう一度入れます。 v0.19.1 は、この版の状態だけを UnEnforced から CurrentEnforced にし、同じ法令の施行日が前の版を PreviousEnforced にします。条の本文は入れ直しません。 状態を書き換えた版があると、取り込みの件数の後に 状態の更新: <件数> 件 (…) の行が出ます。
v0.19.0 はこの版を「中身が同じ」として飛ばしていたので、施行日を過ぎても版が未施行のまま残り、search_fulltext が改正前の条文を返し続けることがありました(houki-egov-mcp #107)。
v0.19.0 で 2026-10-04 以降に --sync した DB
v0.19.0 で 2026-10-04 以降に --sync した DB は、v0.19.1 に上げた後に次のコマンドを 1 回実行してください。未施行のまま残った版の状態を直します(条の本文は入れ直しません。全件の zip 約 290 MB を取得します)。
npx -y @shuji-bonji/houki-egov-mcp@latest --bulk-download-everythingv0.19.1 の --sync や --status が [WARN] 施行日が last_sync_date … を出したときも同じです。 このコマンドが要る DB の正確な範囲は、リポジトリの docs/NOTES.md にあります。
同期の状態を見る
npx -y @shuji-bonji/houki-egov-mcp@latest --statusDB のパス、laws と articles の件数、最後に同期した日付、経過日数、fresh / stale / outdated の判定を表示します。 まだ取り込んでいなければ、その旨と実行するコマンドが出ます。 鮮度は DB 全体で 1 つです(sync_state は 1 行しかありません)。しきい値は houki-hub family で共通で、ローカル DB(全文検索用)にまとめています。
置き場所
既定は ${XDG_CACHE_HOME:-~/.cache}/houki-egov-mcp/laws.db です。 環境変数 HOUKI_EGOV_DB_PATH で変えられます。コマンドライン引数での指定はありません。
MCP サーバーと CLI で HOUKI_EGOV_DB_PATH や XDG_CACHE_HOME が違うと、別々のファイルを指すことになります。 取り込んだはずなのに search_fulltext の応答に source: "api-fallback" が付くときは、まずここを確かめてください。
plugin は環境変数を持たないので、既定の ~/.cache/houki-egov-mcp/laws.db を開きます。環境変数を付けずに実行した CLI は、plugin と同じこのファイルを作り、更新します。 起動のしかたごとに開くファイルと、別のファイルで作った DB の移し方は、ローカル DB(全文検索用)の「DB のファイルの決まり方」にまとめています。
パッケージを更新したとき
DB はパッケージの更新で消えません。取り込み方が変わったときだけ、取り直しが要ります。
| 版 | すること |
|---|---|
| v0.5.0 / v0.5.1 | --bulk-download-everything を実行し直します。v0.5.1 より前に作った DB には、編(Part)を持つ法令(民法・会社法など)の本則が入っていません |
| v0.8.0 | 取り直しは不要です。--sync で最終同期日からの差分を取り込めます |
| v0.19.0 | DB の版を 3 にしました。--bulk-download-everything で作り直します(取り込んだ中身は消えます)。作り直した後は 0.18.x 以前で開かないでください |
| v0.19.1 | DB の版は 3 のままです。v0.19.0 で 2026-10-04 以降に --sync した DB は、--bulk-download-everything を 1 回実行します(条の本文は入れ直しません。上の「施行日の当日に状態が変わる版」) |
各版で何が変わったかは、リポジトリの CHANGELOG にあります。
検索の書き方
- 「民法 不法行為」のように法令名と語を並べると、法令名で絞り込んでから本文を検索します
- 「民法 第709条」「消費税法 第57条の2」のように法令名と条番号だけなら、検索せずにその条を直接返します
- 2 文字の語(「株主」「責任」)は trigram の索引に乗らないため、ヒットした本文に含まれるかで補完します
知っておくとよいこと
- 引数は
tools/listの inputSchema どおりに渡してください。v0.6.0 から、inputSchema に無い引数はINVALID_ARGUMENTになり、detail.issues[].pathにその引数名が入ります - 項が 1 つだけの条(「消費税法施行令第14条の3第1号」のように第1項を書かない条)は、
paragraphを省いてitemだけで号を引けます。項が複数ある条でparagraphを省くとINVALID_ARGUMENTです(v0.6.0 から。v0.5.4 まではitemを黙って無視して条全体を返していました) get_tocは附則の条を編・章の外に平坦に並べます(既知の課題)- 民法・消費税法のような大きな法令は応答が長くなります。
get_tocで位置を確かめてからget_lawで条を指定してください
デジタル庁公式の MCP との関係
本サーバーは e-Gov 法令 API v2 のクライアントで、デジタル庁公式の MCP ではありません。 デジタル庁は 2025 年 12 月〜2026 年 3 月の「法令 × デジタル」ハッカソンで法令 API と MCP の試作を参加者向けに試行提供しました。 法令本文を返す公式 MCP が一般提供された場合は、本サーバーのコアをそちらに委譲する方針です。
詳しい設計と Phase ごとの進捗は、リポジトリの docs/ にあります。利用範囲は免責事項と利用範囲と、リポジトリの DISCLAIMER.md を参照してください。