OpenFisca-Japan MCP
概要
OpenFisca-Japan Web APIのいくつかの制度計算をMCPサーバー経由で提供
目的
ChatGPTなどの一般ユーザーがアクセスするチャットWebアプリにMCP接続することで、通常のチャット使用時に信頼できる制度計算を提供。ChatGPTのような既成の汎用チャット以外にも、特定用途のチャットアプリ(チームみらいの「みらい議会」等)や将来的なヤドカリくんチャットボットに組み込むことも可能。 ClaudeなどのローカルのコーディングエージェントにMCP接続することで、信頼できる制度計算に基づいた作業・解析が可能。(大規模シミュレーションはOpenFisca-JapanのPythonライブラリをインストールしてローカル内で実行したほうが良い。)
背景
将来的には公的な情報は概ねMCPで取得できるようになるだろうが、エージェントがそれらを適切に解釈して、複雑な計算を正しく再現性のある形で実行できるようになるかは未知数。
OpenFisca-Japanも100%正確な制度計算を保証するものではないが、代表的な制度は概ね正しく計算でき、説明可能性も高い。Rule as Codeを盛り上げるという意味でも、試験的にリリースしてみても良さそう。最終的にOpenFiscaがデファクトにならなくてもよいが、現時点では最もデファクトに近い位置にいる。
制度計算において何をどういう基準で簡略化しているかを明示することが重要(例:対象者・金額が少なく、イベント的に発生する控除は省略)
給付付き税額控除の導入が自民・チームみらい等で議論されており、シミュレーションの需要が出てくるかもしれない。給付付き税額控除の計算に用いる所得(税)は、基本的な税でありながら計算手順が複雑で、シミュレーションではしばしば簡易的に計算される。OpenFisca-Japanでは所得税はほぼ実装済み。
給付付き税額控除額を所得に応じてどのように調整するか、年収の壁問題にどう対処するか、など複雑な控除による問題が根深い。(参考リンク) シミュレーションできなければ全容の把握は困難。 対象とする制度
以下の理由で対象制度を絞り込む。
エージェントが必要なユーザー情報を解釈しやすいようにするため。
計算手順・情報に曖昧さが少ない制度を対象とするため。
対象者が多い制度を対象とするため。
優先度順
1. 所得税・住民税・社会保険料:年収から差し引かれる額の大部分
2. 児童手当:OpenFisca-Japan側の修正不要
3. 児童扶養手当・生活保護等:
児童扶養手当は最大額・最小額の扱いも要検討。一部支給〜全額支給の傾斜は未実装。(傾斜の計算式) 生活保護は必要なユーザー情報が増えるため要検討。(ユーザーの入力負荷とエージェントの解釈可能性)
制度計算方法
1. 年収を入力。
2. 年収から経費を差し引く。個人事業主は経費を入力。給与所得者は経費として給与所得控除を差し引く。
対象とする所得控除
実装済み
障害者控除(特別障害者控除含む)
寡婦控除
ひとり親控除
勤労学生控除
配偶者控除・配偶者特別控除
扶養控除
未実装
社会保険料控除:定常的で金額大きい。以下の合計(参考リンク) 国民年金基金の掛金(個人事業主の国民年金保険の上乗せ)
厚生年金基金の掛金(給与所得者の国民年金保険+厚生年金保険の上乗せ)
非対象とする所得控除:対象者・金額が少なく、定常的でない(イベント的)
雑損控除:災害や盗難などで資産に損害を受けたとき
医療費控除:医療費 ー 保険で補填される金額 ー 10万円
小規模企業共済等掛金控除:確定申告必要
生命保険料控除:最大12万円
地震保険料控除:最大5万円
寄付金控除
特定親族特別控除:年齢19歳以上23歳未満に限定
4. 課税所得に所得税率を掛け所得税を算出。
2037年までは所得税の金額に2.1%をかけた復興特別所得税(未実装)の金額も加算
5. 所得税から税額控除を差し引き、最終的な所得税とする。
基本的には所得税の計算と同様
最後に所得税と住民税の差を埋め合わせる調整控除(実装済み)が加算
社会保険料
所得税の社会保険料控除の実装に含まれる
ユーザー情報
必要となるユーザー情報
所得税・社会保険料:世帯構成、年齢、年収、必要経費(個人事業主)、(障害者手帳、学生か否か、国民年金基金の掛金(個人事業主)、厚生年金基金の掛金(給与所得者))
住民税:(+昨年の年収)
児童手当・児童扶養手当:+子供の学年(年齢ではない)
生活保護:+放射線障害、妊産婦、介護施設入所、在宅患者、居住都道府県・市区町村、勤労状況
プライバシー
ユーザー情報がMCPサーバー、OpenFisca-Japanサーバーで永続保存されない旨を明示的にユーザーに伝えるようにし、コード上も辿りやすくする
MCPサーバー実装
言語
★TypeScriptが型安全、普及率、ローカルホストの点で優位か。
npx配布することで、ユーザーのローカル環境にMCPサーバーを立てられ、入力情報は直接OpenFisca-Japanサーバーに送られる。
Pythonも可能だが、型安全や環境構築がやや手間か
リポジトリ
★既存のOpenFisca-Japanとは別リポジトリにすれば、REST API先をOpenFisca-Japanのdevelopブランチにするなど柔軟に対応可能
OpenFisca-JapanはヤドカリくんWebアプリを含み、リリースタイミングが限られる
スキーマ
OpenFiscaのREST APIスキーマ例
code:json
{
"世帯一覧": {
"世帯1": {
"親一覧": [
"太郎"
],
"子一覧": [
"一郎"
],
"児童手当": {
"2025-01-01": null
}
},
"世帯2": {
"親一覧": [
"花子"
],
"児童手当": {
"2025-01-01": null
}
}
},
"世帯員": {
"太郎": {
"所得": {
"2025-01-01": 4000
},
"誕生年月日": {
"ETERNITY": "1980-01-01"
}
},
"花子": {
"所得": {
"2025-01-01": 2500
},
"誕生年月日": {
"ETERNITY": "1984-01-01"
}
},
"一郎": {
"所得": {
"2025-01-01": 0
},
"誕生年月日": {
"ETERNITY": "2024-01-01"
}
}
}
}
ルートから世帯と世帯員に分かれていて、複数世帯がどう構成されているか分かりにくい。
知りたいvariable(制度)をあらかじめ世帯と世帯員の所定の位置にnullで指定しておく必要がある
日付入力が必須
より直感的なMCPサーバー・SDKのスキーマ
環境変数
OpenFisca-JapanのREST API のURL
入力
世帯構成:世帯単位のdictのリスト(世帯名をkeyにするdictもあり?)
keyは固定で、valueのdefaultはnull
code:json
[ # 世帯のリスト
{
"name": "household1", # 世帯名は一意に設定
"household_attribute": { # 所得税・住民税・社会保険料・児童手当の算出には不要
"居住都道府県": "東京都",
"居住市区町村": "新宿区"
},
"member": [{ # 世帯員のリスト
"name": "太郎" # 世帯員の名前は異なる世帯間で重複しても良い。MCPのtool側で一意に再設定
"年齢": "40", # MCPのTool側で誕生年月日に置き換え (学年算出の不正確さは許容)
# Entityのroleも年齢から判定する (18歳以上/以下)
"収入": 10000000, # 以下はvariableのkeyとvalue
"個人事業主の必要経費": null, # int
# 賞与, 学生, 障害者手帳, 年金基金は一旦省略
...
},
{...
}
]
},
{
"name": "household2",
...
},
...
]
output_attribute_list: 出力したい属性(variable)リスト
variableが世帯か世帯員に属するものかは、MCPのtool側で事前定義をもとに判定
ex. ["児童手当", "所得税"]
一旦、所得税・住民税・社会保険料に限定
date: オプション引数。計算する時点となる日付。入力されていない場合は現在の日付が使われる。
出力
入力した世帯構成jsonと同じフォーマットで、入力属性が出力属性に置き換えられたもの。