nta_get_tax_answer の仕様
INFO
houki-nta-mcp v0.27.1 の specs/current/nta_get_tax_answer/spec.md から自動生成しました(仕様 ID 18 件・2026-10-12)。手で編集しないでください。再生成は node scripts/generate-reference.mjs specs です。
タックスアンサーを番号で 1 件取得する
使いどころ・引数・実測の呼び出し例は、ツールのページにあります。
最後に仕様が変わったのは v0.25.1 の「nta_get_tax_answer の sections で、ページの小見出し h3 も節にし、節ごとに見出しの段(level)を返す(nta #147)」(2026-10-05 承認)です。それまでの経緯は承認の履歴にあります。
利用者と得られる結果
この機能の利用者と、利用者が渡すもの・得られる結果を示します。
- MCP クライアント(Claude などの LLM、または CLI から呼ぶ人)。タックスアンサー番号
noを渡して、国税庁の「タックスアンサー(よくある税の質問)」1 件の本文(見出しごとの節)を受け取る
入力
呼び出すときに渡す値です。
| 引数 | 必須 | 内容 |
|---|---|---|
no | 必須 | タックスアンサー番号。数字 4 桁(全角は半角に揃えてから読む。001・012・015)。例: "6101"(消費税の基本的なしくみ)、"1120"(医療費控除)。税目フォルダは国税庁の索引で決める(003・016) |
format | 任意 | markdown(既定)または json |
記事は国税庁の索引(/taxes/shiraberu/taxanswer/code/)で番号から URL を決める。番号の先頭の桁はおおむね税目を表すが、2xxx の一部は所得税(shotoku)、4xxx は相続税(sozoku)・贈与税(zoyo)・財産の評価(hyoka)、7xxx は印紙税(inshi)・法定調書(hotei)・不服申立て(fufuku)、8xxx は災害(saigai)のように分かれる
扱わないこと
この機能が意図して扱わないことです。
- 記事を題名やキーワードから探すこと(探すのは
nta_search_tax_answer) - 国税庁の索引に無い番号の記事を取ること(
DOC_NOT_FOUND。0xxx帯は索引に無い) - 「根拠法令等」の節に挙がった法令・通達を読み取って
related_laws/related_tsutatsu/next_actionsを付けること(nta_get_qaの【関係法令通達】と違い、節の文字列のまま返す) - 本文の中の画像・表・添付 PDF の内容を返すこと(段落の文字列だけ)
- 記事が今の法令でも成り立つかを判定すること(
taxAnswer.effectiveDateは国税庁が書いた法令時点をそのまま返す) - 1 回の呼び出しで複数の番号を取ること
処理の流れ
呼び出しを受けてから応答を返すまでに、何をどの順で確かめるかを示します。図の中の番号は「できること」の仕様 ID の末尾 3 桁です。
仕様項目
この機能の仕様項目を、仕様 ID ごとに並べています。見出しは仕様項目を 1 文で表したもので、条件・応答の細部・例は「詳細」を開くと読めます。仕様 ID はそれぞれ受入テストと対応していて、テストの無い ID があると各リポジトリの CI が止まります。
SPEC-NTA-GET-TAX-ANSWER-001 番号が空か数字でなければ取りに行かない
詳細
no が空文字のときは、inputSchema の minLength: 1 の検査(SPEC-NTA-COMMON-ERRORS-013)で止まり、INVALID_ARGUMENT(tool: "nta_get_tax_answer"、detail.issues: [{ path: "no", message: "空文字は指定できません" }])を返す。空白だけのときは、SPEC-NTA-COMMON-ERRORS-014 の形の INVALID_ARGUMENT(error: "no が空です"、detail.issues: [{ path: "no", message: "空白だけは指定できません" }])を返す。前後の空白を除いた値が半角の数字以外の文字を含む("abc"、"61-01" など)ときは、SPEC-NTA-COMMON-ERRORS-015 の形の INVALID_ARGUMENT(error: "no の形が受け付ける形ではありません: <渡した値>"、detail.issues: [{ path: "no", message: "半角の数字 4 桁で指定してください" }]、hint に "6101"・"1120" のような例)を返す。どれも DB も国税庁サイトも引かない。全角の数字は半角に揃えてから見る(SPEC-NTA-GET-TAX-ANSWER-015)。
例: no: "" は detail.issues[0].message: "空文字は指定できません"。no: " " は error: "no が空です"。no: "abc" は detail.issues[0].message: "半角の数字 4 桁で指定してください"。どれも code: "INVALID_ARGUMENT"・tool: "nta_get_tax_answer"。
SPEC-NTA-GET-TAX-ANSWER-003 記事の URL は国税庁の索引で決め、DB にある行はその行の URL を使う
詳細
国税庁サイトから記事を取りに行くときの URL は、番号の先頭の桁ではなく、次の順に決める。
- DB にその番号の行があり、節の構造を持たない(SPEC-NTA-GET-TAX-ANSWER-010)ときは、その行の出典 URL
- DB にその番号の行が無いときは、国税庁の索引(SPEC-NTA-GET-TAX-ANSWER-016)でその番号の URL を探す。索引に無ければ取りに行かずに SPEC-NTA-GET-TAX-ANSWER-013 の
DOC_NOT_FOUND
決めた URL を 1 回だけ取得する。税目フォルダは、取得した URL の taxanswer/ の次の要素である。
例(2026-10-03 JST の索引):
no | 取りに行く URL | 税目フォルダ | v0.23.0 で取りに行った URL |
|---|---|---|---|
6101 | /taxes/shiraberu/taxanswer/shohi/6101.htm | shohi | 同じ |
2010 | /taxes/shiraberu/taxanswer/shotoku/2010.htm | shotoku | /gensen/2010.htm(404 ページへの転送) |
4402 | /taxes/shiraberu/taxanswer/zoyo/4402.htm | zoyo | /sozoku/4402.htm(転送) |
7400 | /taxes/shiraberu/taxanswer/hotei/7400.htm | hotei | /inshi/7400.htm(転送) |
3429 | /taxes/shiraberu/taxanswer/hojin/3429.htm | hojin | /joto/3429.htm(転送) |
8001 | /taxes/shiraberu/taxanswer/saigai/8001.htm | saigai | 取りに行かず INVALID_ARGUMENT |
索引の 755 件のうち、番号の先頭の桁から決めていた税目フォルダと違うものは 129 件(先頭 2 の shotoku 37 件、3 の shotoku・hojin 各 1 件、4 の hyoka・zoyo 各 29 件、7 の hotei 14 件・fufuku 2 件、8 の saigai 16 件)。
SPEC-NTA-GET-TAX-ANSWER-004 ローカル DB にある記事は DB から返す
詳細
その番号の記事がローカル DB にある(--bulk-download-tax-answer または以前の取得で入った)ときは、国税庁サイトに取りに行かずに DB の内容を返す。json の応答の source は db。taxAnswer.fetchedAt は DB に入れたときの日時のまま(呼び出した時刻にしない)。
SPEC-NTA-GET-TAX-ANSWER-005 DB に無い記事は国税庁サイトから取る
詳細
その番号の記事が DB に無いときは、SPEC-NTA-GET-TAX-ANSWER-003 で決めた URL のページを取得して返す。json の応答の source は live。8xxx 帯(災害を受けたら、saigai フォルダ)の記事も同じく取る。
例: DB に無い { no: "8001" } は、索引で /saigai/8001.htm を決めて取り、taxAnswer.title に「災害等による期限の延長」を含む応答を source: "live" で返す(v0.23.0 では INVALID_ARGUMENT)。
SPEC-NTA-GET-TAX-ANSWER-006 国税庁サイトから取った記事は DB に入り、次からは DB から返す
詳細
SPEC-NTA-GET-TAX-ANSWER-005 で取得した記事は DB に入る。行の税目は、取得した URL の税目フォルダ(SPEC-NTA-GET-TAX-ANSWER-003)で、--bulk-download-tax-answer が同じ記事に入れる値と同じになる。同じ番号をもう一度求められたときは国税庁サイトに取りに行かず、source が db の応答を返す。このときの応答は、国税庁サイトから取ったときと同じ構造である(taxAnswer.sections の節の数が同じで、taxAnswer.fetchedAt は最初に取得した日時のまま)。DB への書き込みに失敗しても、その呼び出しの応答は返す。
例: { no: "2010" } を国税庁サイトから取ると、DB の行の税目は shotoku(v0.23.0 の先頭の桁の表なら gensen だったが、v0.23.0 ではその URL が 404 ページへの転送で、行は作られなかった)。
SPEC-NTA-GET-TAX-ANSWER-007 markdown(既定)の応答
詳細
format を省くか markdown にしたとき、応答は次を含む文字列である。DB から返したときも国税庁サイトから取ったときも同じ形。
- 見出し
# No.<番号> <題名>(例:# No.6101 消費税の基本的なしくみ) > 法令時点: <ページに書かれた時点>(例:> 法令時点: 令和8年4月1日現在法令等)と> 対象税目: <税目>(例:> 対象税目: 消費税)の行。ページに無いものは出さない- 節(SPEC-NTA-GET-TAX-ANSWER-019)ごとに、見出しの行とその段落。見出しの行は、
levelが 2 の節(ページの h2)は## <見出し>、levelが 3 の節(ページの h3)は### <見出し>。段落の無い節(019 の、次の見出しが h3 の h2 の節)は見出しの行だけを出す。「対象税目」の見出しは節にせず、上の> 対象税目:の行にする 出典: <国税庁ページの URL>・取得: <取得日時>・取得元: <ローカル DB(bulk download で取り込んだもの)| 国税庁サイト(この呼び出しで取得)>- タックスアンサーの位置付けの注(国税庁の参考解説資料で法的拘束力はなく、実務判断は通達・法令本文に基づく必要があること)
例(2026-10-05 JST の No.6101。「消費税の負担者」から「納税事務の負担軽減措置等」までの 4 つはページでは「概要」の下の h3): 見出しの行は、上から ## 概要・### 消費税の負担者・### 課税のしくみ・### 申告・納付・### 納税事務の負担軽減措置等・## 根拠法令等・## 関連リンク の 7 行になる(v0.25.0 では ## 概要・## 根拠法令等・## 関連リンク の 3 行で、h3 の 4 つの段落は ## 概要 の下に続いた)。
SPEC-NTA-GET-TAX-ANSWER-008 json の応答
詳細
format を json にしたとき、応答は次のフィールドを持つ。値の無いフィールドは null にし、キーは無くさない。
| フィールド | 内容 |
|---|---|
taxAnswer.no | 記事番号。引数の no(前後の空白を除いたもの。SPEC-NTA-GET-TAX-ANSWER-011)。例: "1120" |
taxAnswer.title | 題名。例: "医療費を支払ったとき(医療費控除)" |
taxAnswer.effectiveDate | ページに書かれた法令時点の文字列。例: "令和7年4月1日現在法令等"。無いときは null |
taxAnswer.basisDate | effectiveDate から読んだ日付(YYYY-MM-DD)。例: "2025-04-01"。effectiveDate が null か、日付を読めないときは null。検索の results[].basisDate(SPEC-NTA-SEARCH-RULES-015)と同じ値 |
taxAnswer.taxCategory | 対象税目。例: "消費税"。無いときは null |
taxAnswer.sections | 節の配列。節の分け方と並べ方は SPEC-NTA-GET-TAX-ANSWER-019。要素は heading(見出し)、paragraphs(段落の文字列の配列)、level(ページの見出しの段。h2 は 2、h3 は 3)の 3 つのキーを持つ。配列は 1 件以上ある。paragraphs が空の要素は、019 の「次の見出しが h3 の h2」の節だけ |
taxAnswer.sourceUrl / taxAnswer.fetchedAt | 出典 URL と取得日時 |
index_status / orphaned_at / notice | SPEC-NTA-GET-TAX-ANSWER-009。索引にある記事と、この呼び出しで国税庁サイトから取った記事では null |
source | db または live |
legal_status | binds_citizens: false / binds_courts: false / binds_tax_office: false と注 |
日付の読み方は、和暦の「<元号><年>年<月>月<日>日」を西暦の YYYY-MM-DD にする(元年は 1 年)。DB の経路でも国税庁サイトの経路でも同じ読み方で、bulk download が DB の発出日の列に入れる値と同じになる。
例: 法令時点が 令和7年4月1日現在法令等 の記事は taxAnswer.effectiveDate: "令和7年4月1日現在法令等"・taxAnswer.basisDate: "2025-04-01"。法令時点の書かれていない記事は taxAnswer.effectiveDate: null・taxAnswer.basisDate: null(v0.22.0 では effectiveDate のキーが無く、basisDate は無かった)。taxAnswer.sections の要素は、v0.25.0 では heading と paragraphs の 2 つのキーで、level は無かった。
SPEC-NTA-GET-TAX-ANSWER-009 国税庁の索引から消えた記事に印を付け、それ以外では印のキーを null にする
詳細
DB から返す記事(SPEC-NTA-GET-TAX-ANSWER-004)が国税庁の索引から外れている(bulk download で外れたことを確認した日時が付いている)ときは、応答に印を付ける。
formatがjsonのとき:index_status: "removed_from_index"、orphaned_at(確認した日時。例:"2026-10-01T00:30:00Z")、notice(索引から外れている旨と、過去の課税期間では意味を持つ場合があること、現在の取扱いは最新の通達で確かめること、出典 URL が 404 になることがあることの注記)を付けるformatを省くかmarkdownのとき:# No.<番号> <題名>の見出しと> 法令時点:/> 対象税目:の行(あるとき)の後、最初の##の節の前に、> **索引の状態**: removed_from_index(<確認した日時> に確認)の行と、>で始まる注記の行を入れる- 索引にある記事と、この呼び出しで国税庁サイトから取った記事では、json の
index_status・orphaned_at・noticeをどれもnullにし(キーは無くならない)、markdown に「索引の状態」の行と注記を入れない
注記の文は nta_get_jimu_unei(SPEC-NTA-GET-JIMU-UNEI-004)と同じである。
例: 索引にある記事を DB から format: "json" で取ると、index_status: null・orphaned_at: null・notice: null(v0.22.0 ではどのキーも無かった)。
SPEC-NTA-GET-TAX-ANSWER-010 節の構造を持たない DB の行は、国税庁サイトから取り直す
詳細
DB にその記事の行があっても、節の構造(見出しと段落を分けたもの)を持たない行(v0.16.0 より前に DB に入れた行)や、構造の記録が読めない行は、DB から返さず、DB に無いとき(SPEC-NTA-GET-TAX-ANSWER-005)と同じく国税庁サイトから取る。応答の source は live になり、取った記事は SPEC-NTA-GET-TAX-ANSWER-006 のとおり DB に書き戻す。次の呼び出しからは DB から返す(source: "db")。
SPEC-NTA-GET-TAX-ANSWER-011 記事番号は引数の no で決め、応答と DB の行に空の番号を入れない
詳細
記事番号は、ページの見出しではなく引数の no(前後の空白を除いたもの)で決める。ページの見出しが No.<番号> <題名> の形でなくても、次のとおりになる。
- json の
taxAnswer.noと markdown の見出し# No.<番号> <題名>の番号はno。題名は見出しの文字列のまま - 国税庁サイトから取った記事を DB に書き戻す行(SPEC-NTA-GET-TAX-ANSWER-006)の文書 ID は
no、税目は取得した URL の税目フォルダ。文書 ID が空の行は作らない。次の呼び出しは DB から返す(source: "db") - DB から返すとき(SPEC-NTA-GET-TAX-ANSWER-004)、行に記録された番号が空でも
taxAnswer.noはno
例: 見出しが 消費税の基本的なしくみ(No. が無い)のページを no: "6101" で取ると、taxAnswer.no は "6101"、taxAnswer.title は "消費税の基本的なしくみ"、DB の行の文書 ID は 6101、税目は shohi。同じ番号をもう一度求めると source は db で taxAnswer.no は "6101"。
SPEC-NTA-GET-TAX-ANSWER-012 番号は 4 桁で、桁数が違えば取りに行かずに INVALID_ARGUMENT を返す
詳細
no は、前後の空白を除いて半角の数字 4 桁である(SPEC-NTA-COMMON-ERRORS-015)。数字だけだが 4 桁でない("61"、"61011")ときは、DB と索引を引く前に、INVALID_ARGUMENT(tool: "nta_get_tax_answer"、error: "no の形が受け付ける形ではありません: <渡した値>"、detail.issues: [{ path: "no", message: "半角の数字 4 桁で指定してください" }]、hint に "6101"・"1120" のような例)を返す。DB も国税庁サイトも引かない。先頭の桁では断らない(4 桁の数字ならどの番号帯も DB と索引で探す)。
例: no: "6101"・"8001"・"0101" は検査を通る。no: "61" と no: "61011" は code: "INVALID_ARGUMENT"・detail.issues[0].path: "no" で、DB も国税庁サイトも引かない。no: "0101" は、DB にも索引にも無ければ SPEC-NTA-GET-TAX-ANSWER-013 の DOC_NOT_FOUND(v0.23.0 では先頭の桁が未対応の INVALID_ARGUMENT)。
SPEC-NTA-GET-TAX-ANSWER-013 索引に番号が無いとき、または国税庁サイトにページが無い(404・410・404 ページへの転送)ときは DOC_NOT_FOUND を返し、検索ツールを案内する
詳細
次のどちらかのときは、エラー DOC_NOT_FOUND(retryable: false)を返す(SPEC-NTA-COMMON-ERRORS-016)。SOURCE_* にはしない。
noの記事が DB に無く、国税庁の索引(SPEC-NTA-GET-TAX-ANSWER-016。取り直しの後も)にもその番号が無い。記事のページは取りに行かない- 記事のページを取りに行き、国税庁サイトが HTTP 404 か 410 を返した、または
https://www.nta.go.jp/error/404.htmに転送した
本文は次のとおり。
error: 渡した引数の値と、そのタックスアンサーが国税庁の索引に無いこと(前者)/そのページが国税庁サイトに無いこと(後者)hint: 番号を確かめる案内(nta_search_tax_answer で探す)next_actions:{ action: "nta_search_tax_answer", reason: "キーワード検索で正しい番号を探せます", example: { keyword: "<探したい語>" } }の 1 件。retry_laterは入れないdetail: 前者はurlに索引の URL(statusは付けない)。後者はstatusに国税庁サイトが返した HTTP ステータス(転送のときは 404)、urlに取りに行った URLtool:nta_get_tax_answer
例: 索引に無い { no: "6999" } は、記事のページを取りに行かずに code: "DOC_NOT_FOUND"、retryable: false、next_actions[0].action: "nta_search_tax_answer"。索引にあるが国税庁サイトが記事のページを /error/404.htm に転送したときも、410 を返したときも同じ code(detail.status は 404 か 410)。
SPEC-NTA-GET-TAX-ANSWER-014 国税庁サイトとの通信が失敗したときは、失敗の種類ごとの SOURCE_* を返す
詳細
記事のページを国税庁サイトから取るときに、要求がページが無い(SPEC-NTA-GET-TAX-ANSWER-013)以外の形で失敗したときは、SPEC-NTA-COMMON-ERRORS-018 の表の code・retryable・next_actions・detail のエラーを返す。tool は nta_get_tax_answer。索引の取得の失敗は SPEC-NTA-GET-TAX-ANSWER-017。
| 国税庁サイト | code | retryable | next_actions |
|---|---|---|---|
| HTTP 429 | SOURCE_RATE_LIMITED | true | retry_later |
| 30 秒以内に応答しない(取り直しても) | SOURCE_TIMEOUT | true | retry_later |
| HTTP 5xx(取り直しても) | SOURCE_API_ERROR | true | retry_later |
| HTTP 403・400 など(404・410・429 を除く 4xx) | SOURCE_API_ERROR | false | 付けない |
| 接続できない(取り直しても。SPEC-NTA-COMMON-ERRORS-019) | SOURCE_UNAVAILABLE | true | retry_later |
例: 国税庁サイトが記事のページに 503 を返す状態で { no: "6101" } を渡すと、code: "SOURCE_API_ERROR"、retryable: true、detail.status: 503。403 なら retryable: false・next_actions 無し、接続できない(cause.code: "ENOTFOUND")なら SOURCE_UNAVAILABLE(v0.23.0 ではどれも SOURCE_API_ERROR・retryable: true)。
SPEC-NTA-GET-TAX-ANSWER-015 no は半角に揃えてから形を確かめる
詳細
no は、前後の空白を除いた値を houki-abbreviations の normalizeJpText の規則(全角英数字を半角に、ダッシュ類 - ‐ ‑ – — ― − を - に、全角チルダ ~ 〜 を ~ に、全角空白を半角空白にし、前後の空白を除く。罫線 ─ と長音 ー は変えない。大文字と小文字は区別する)で揃えてから、SPEC-NTA-GET-TAX-ANSWER-001・012 の形の検査に進む(SPEC-NTA-SEARCH-RULES-019)。揃えた後の値で DB と国税庁の索引を引く。
例: { no: "6101" } は { no: "6101" } と同じ応答(v0.21.3 では数字以外として INVALID_ARGUMENT だった)。
SPEC-NTA-GET-TAX-ANSWER-016 国税庁の索引を DB に保存して使い回し、番号が見つからないときにだけ取り直す
詳細
記事の URL を決める(SPEC-NTA-GET-TAX-ANSWER-003)ために、国税庁のタックスアンサーの索引 https://www.nta.go.jp/taxes/shiraberu/taxanswer/code/ を使う。索引は、記事ごとに番号・記事の URL・税目フォルダ(URL の taxanswer/ の次の要素)を持つ一覧である。
- 索引を国税庁サイトから取ったときは、その一覧と、応答の
Last-Modified/ETagを DB に保存する。次の呼び出しでは国税庁サイトから取り直さずに保存した一覧を使う。使い回す期間は設けない - 保存した一覧にその番号が無いときは、1 回の呼び出しにつき 1 回だけ、前回の
Last-Modified/ETagを付けて索引を取り直す。変わっていれば(200)一覧を保存し直して探し直す。変わっていない(304)か、取り直しても無ければ、SPEC-NTA-GET-TAX-ANSWER-013 のDOC_NOT_FOUNDを返す - その呼び出しで索引を取った(保存が無かった)ときは取り直さない
- 1 回の呼び出しで国税庁サイトから取るページは、索引(取り直しを含めて最大 2 回)と記事の 1 ページまで。ページとページのあいだは 0.3 秒あける(SPEC-NTA-GET-TSUTATSU-015 と同じ)
--bulk-download-tax-answerも同じ索引から記事を集める。bulk download が索引を DB に保存するかは cli_bulk_download で決める
国税庁サイトに新しい記事が足されたときは、保存した一覧に無い番号として取り直しが起き、そこで見つかる。記事が消えたときは、保存した一覧の URL を取りに行き、ページが無い(404 ページへの転送)ので SPEC-NTA-GET-TAX-ANSWER-013 の DOC_NOT_FOUND になる。
例(2026-10-03 13:37 JST に確かめた値): 索引は 200 で last-modified: Tue, 15 Sep 2026 08:58:03 GMT、etag: "25b0a-65b81bf96ae40" を返し、If-None-Match か If-Modified-Since を付けると 304 を返した。索引の記事の URL は 755 件で、番号の重複は無く、0 で始まる番号は無かった。
SPEC-NTA-GET-TAX-ANSWER-017 索引の取得に失敗したときは、記事を取りに行かずに SOURCE_* を返す
詳細
索引(SPEC-NTA-GET-TAX-ANSWER-016)の取得が失敗したときは、記事のページを取りに行かず、SPEC-NTA-COMMON-ERRORS-018 の表の code・retryable・next_actions のエラーを返す。url と detail.url は索引の URL、tool は nta_get_tax_answer。
- 索引のページが 404・410・404 ページへの転送で終わったときは、索引の URL はこのサーバーが決めた値なので、
DOC_NOT_FOUNDではなくSOURCE_API_ERROR(retryable: false、detail.status)にする。国税庁サイトの構成が変わったと考えられるので、hintに報告を求める文を入れる - 取り直し(016 の条件付きの取り直し)が失敗したときも同じ
索引を読み取れた(200)が記事の URL が 1 件も無いときは、SPEC-NTA-COMMON-ERRORS-009 の INTERNAL_ERROR(error: "タックスアンサーの索引のパースに失敗: <理由>")にし、保存してあった一覧は書き換えない。
例: DB に無い番号を { no: "6101" } で求め、保存した索引も無く、国税庁サイトが索引に 503 を返し続けると、code: "SOURCE_API_ERROR"、retryable: true、url は索引の URL で、記事のページ /shohi/6101.htm は取りに行かない。
SPEC-NTA-GET-TAX-ANSWER-018 保存した索引を読めない・保存できないときも記事を返し、MCP サーバーのログに warn で残す
詳細
記事の URL を国税庁の索引で決めるとき(SPEC-NTA-GET-TAX-ANSWER-016)の、DB に保存した索引(SPEC-NTA-DB-SCHEMA-025)の読み書きは次のとおりにする。
| 場面 | 動き | ログ |
|---|---|---|
tax_answer_index_page に索引の URL の行が無い(まだ保存していない) | 索引を取って保存し、そこで探す(016 のとおり) | 出さない |
tax_answer_index_page か tax_answer_index を読む SQL が失敗した(表の列が足りないなど) | まだ保存していないときと同じに、条件を付けずに索引を取り、そこで探す | warn を 1 行 |
取った索引の保存(tax_answer_index の置き換えと tax_answer_index_page の書き換え)が失敗した | 取った索引で URL を決めて続ける。保存は前の行のまま(025 の「途中で失敗したら前の行を残す」) | warn を 1 行 |
304 のときの tax_answer_index_page.fetched_at の書き換えが失敗した | 「索引に無い」として SPEC-NTA-GET-TAX-ANSWER-013 の DOC_NOT_FOUND を返す(016 のとおり) | warn を 1 行 |
どの場面でも、記事を取れれば記事を返す。応答は、読み書きが成功したときと同じで、INTERNAL_ERROR にせず、応答にフィールドを足さない(記事は正しく返せるため)。
ログは MCP サーバーの標準エラー出力の JSON の 1 行で、level は warn、scope は nta_get_tax_answer。msg と meta は次のとおり。<表の名前> は失敗した SQL の表(tax_answer_index か tax_answer_index_page)、<DB の絶対パス> は開いた DB のファイルの絶対パス(SPEC-NTA-DB-SCHEMA-026。ホームディレクトリを ~ に置き換えない)。
| 場面 | msg |
|---|---|
| 読めない | 保存したタックスアンサーの索引を読めないため、国税庁サイトから取り直します(表: <表の名前>、DB: <DB の絶対パス>) |
| 保存できない | タックスアンサーの索引を DB に保存できませんでした(表: <表の名前>、DB: <DB の絶対パス>) |
| 取得日時を書き換えられない | タックスアンサーの索引の取得日時を DB に書き換えられませんでした(表: tax_answer_index_page、DB: <DB の絶対パス>) |
meta は { table: "<表の名前>", db_path: "<DB の絶対パス>", error: { name: "<例外の名前>", message: "<例外の文>" } }。
例(壊れた表の DB): 版 12 の DB で、tax_answer_index を url の列の無い表に作り替え(DROP TABLE tax_answer_index; CREATE TABLE tax_answer_index (no TEXT PRIMARY KEY, taxonomy TEXT NOT NULL, title TEXT NOT NULL);)、tax_answer_index_page に ('https://www.nta.go.jp/taxes/shiraberu/taxanswer/code/', '2026-10-01T00:00:00.000Z', NULL, '"25b0a-65b81bf96ae40"') の行を入れておく。この DB で { no: "6101", format: "json" } を呼ぶと次のようになる。
- 索引の要求には
If-None-MatchもIf-Modified-Sinceも付かない(保存した索引を読めないため、保存していないときと同じに取る) - 記事を返す(
source: "live"、taxAnswer.no: "6101")。isErrorは無い - 標準エラー出力に
warnが 2 行出る。1 行目はmsgが保存したタックスアンサーの索引を読めないため、…(表: tax_answer_index、DB: <DB の絶対パス>)、meta.error.messageがno such column: url。2 行目はmsgがタックスアンサーの索引を DB に保存できませんでした(表: tax_answer_index、DB: <DB の絶対パス>)、meta.error.messageがtable tax_answer_index has no column named url tax_answer_index_pageの行はfetched_atが2026-10-01T00:00:00.000Zのまま- 同じ DB で、記事がまだ DB に無い番号でもう一度呼ぶと(または 1 回目に書き戻された記事の行を消してから呼ぶと)、同じく索引を条件なしで取り、同じ 2 行の
warnを出す。同じ番号でもう一度呼ぶと、1 回目に書き戻した記事を DB から返し、索引は引かない(SPEC-NTA-GET-TAX-ANSWER-016)
v0.24.0 では、同じ DB で記事は返ったが、読めない・保存できないことはログにも応答にも出なかった(houki-nta-mcp #137)。表がまだ無い DB は、DB を開いたときにテーブルを作る(SPEC-NTA-DB-SCHEMA-001・022)ので、この表の 2 行目には当たらない。
SPEC-NTA-GET-TAX-ANSWER-019 ページの見出し h2 と h3 をどちらも節の区切りにし、節ごとに見出しの段を level で返す
詳細
記事のページの本文の見出し h2 と h3 のそれぞれで節を切り、taxAnswer.sections(SPEC-NTA-GET-TAX-ANSWER-008)に次のとおり入れる。
- 節の段落は、その見出しの次から、次の h2 か h3 の前までの段落である。h3 の段落は、その上の h2 の節には入れない
- 節は、見出しがページに現れる順に、1 つの配列に並べる。h3 の節を h2 の節の中に入れ子にしない。各節の
levelは、h2 の節が2、h3 の節が3である。h3 の節がどの h2 の節の下にあるかは、配列の中でその h3 の節より前にある、最も近いlevel: 2の節で分かる - 段落が 1 つも無い節は作らない。ただし、h2 の次の見出しが h3 のとき(h2 の直後に段落が無く、すぐ小見出しが続くとき)は、その h2 の節を
paragraphs: []・level: 2で作る。h2 の見出しの文字列を残すためである - 「対象税目」の h2 は節にせず、
taxAnswer.taxCategoryにする(今のまま)。「サイトマップ」「お問い合わせ先」で始まる見出しは、h2 でも h3 でも節にしない - h4 以下の見出しは、節の区切りにも段落にもしない(今のまま)
- 節の分け方と
levelは、国税庁サイトから取ったとき(SPEC-NTA-GET-TAX-ANSWER-005)、取った記事を DB に書き戻した後に DB から返すとき(SPEC-NTA-GET-TAX-ANSWER-006)、--bulk-download-tax-answerで入れた行を DB から返すとき(SPEC-NTA-GET-TAX-ANSWER-004)のどれでも同じである - v0.25.0 以前に DB に入れた行の節は
levelを持たない。その節はすべて h2 の見出しで切ったものなので、DB から返すときはlevel: 2を入れて返す。その行の節の分け方は、入れ直すまで v0.25.0 以前のまま(h3 の見出しは無く、h3 の段落は上の h2 の節に入っている)。入れ直し方は CHANGELOG 0.25.1 に書く
例 1(2026-10-05 JST の No.6101。h2「概要」の下に h3 が 4 つある): { no: "6101", format: "json" } を国税庁サイトから取ると、taxAnswer.sections は次の 7 つになる。段落の数は 2026-10-05 JST のページのもの。
| 順 | heading | level | paragraphs の数 |
|---|---|---|---|
| 1 | 概要 | 2 | 5 |
| 2 | 消費税の負担者 | 3 | 1 |
| 3 | 課税のしくみ | 3 | 4 |
| 4 | 申告・納付 | 3 | 4 |
| 5 | 納税事務の負担軽減措置等 | 3 | 12 |
| 6 | 根拠法令等 | 2 | 1 |
| 7 | 関連リンク | 2 | 8 |
v0.25.0 では 概要(26)・根拠法令等(1)・関連リンク(8)の 3 つで、h3 の 4 つの見出しの文字列はどこにも入らず、その段落は 概要 に続けて入った。
例 2(2026-10-05 JST の No.1222。h2 の直後に h3 が続く節がある): taxAnswer.sections の heading・level・paragraphs の数は次の 12 になる。
| 順 | heading | level | paragraphs の数 |
|---|---|---|---|
| 1 | 概要 | 2 | 4 |
| 2 | 対象者または対象物 | 2 | 0 |
| 3 | 対象者 | 3 | 1 |
| 4 | 控除の適用を受けるための要件 | 3 | 2 |
| 5 | 計算方法・計算式 | 2 | 0 |
| 6 | 住宅耐震改修特別控除の控除額の計算方法 | 3 | 26 |
| 7 | 手続き | 2 | 0 |
| 8 | 申告等の方法 | 3 | 2 |
| 9 | 申告先等 | 3 | 1 |
| 10 | 提出書類等 | 2 | 4 |
| 11 | 根拠法令等 | 2 | 1 |
| 12 | 関連リンク | 2 | 8 |
v0.25.0 では 概要(4)・対象者または対象物(3)・計算方法・計算式(26)・手続き(3)・提出書類等(4)・根拠法令等(1)・関連リンク(8)の 7 つだった。markdown では、2・5・7 番は ## <見出し> の行だけ、3・4・6・8・9 番は ### <見出し> の行と段落になる。
例 3(h3 の無いページ): 見出しがすべて h2 のページ(2026-05-01 に保存した No.6101 のページなど)では、節の分け方は v0.25.0 と同じで、どの節も level: 2 になる。
例 4(v0.25.0 以前に入れた行): 2026-10-04 に 0.25.0 で取り込んだ No.6101 の行(節は 概要・根拠法令等・関連リンク の 3 つ)を DB から返すと、taxAnswer.sections は同じ 3 つで、どれも level: 2 になる(source: "db")。
実装する人に向けた情報
ここから下は、この機能を実装する人と、仕様の変更を追う人に向けた節です。使い方を知りたいだけなら、読まなくて構いません。
検討中のこと
仕様を書き起こしたときに見つかった項目のうち、扱いを Issue で検討しているものです。ここに挙げたことは、今後の版で変わることがあります。開くと、元の仕様書の記述をそのまま読めます。
仕様書の「未決」の節
初版起こしで見つけた、意図か不具合かを人が決める項目です。決まったら「できること」に ID を振るか、specs/changes/ の差分にします。
意図か不具合かの判断が要る項目は houki-nta-mcp の Issue に移し、ここには題と Issue の番号だけを残します。今の振る舞いのままでよくテストが無いだけの項目は、受入テストを書いてから「できること」に ID を振ります。
承認の履歴
この機能の仕様が、いつ、どの変更で承認されたかを新しい順に並べています。各リポジトリの npx spec-ids history nta_get_tax_answer と同じ内容です。変更の名前から、変更の理由と前後の振る舞いを書いた文書(GitHub)を開けます。
承認の履歴(15 件)
関連ページ
このページの元になった文書と、あわせて読むページです。