UNICEF Stats MCP について
UNICEF Stats MCPは、UNICEF Data Warehouseの子ども関連統計を調べるための実験的なMCPサーバーです。指標、国、属性別の検索にAPIキーなしで対応しますが、UNICEF公式製品ではなく、引用前に値の確認が必要です。
主な機能
- 01子ども関連指標790項目以上の検索
- 02200か国以上をカバー
- 03性別、年齢、富、居住地による絞り込み
- 04簡潔または全項目のJSONデータ出力
- 05分析用プロンプトとリソースの提供
活用シーン
- 01国別の子どもの発達指標を検索
- 02国をまたいで指標を比較
- 03人口属性別に統計を調査
- 04AIを用いた統計分析の準備
MCP 対応
このサーバーは、統計データ探索用のプロンプトやリソースとともに、MCPツールからUNICEF統計を提供します。SDMX API経由でUNICEF Data Warehouseを照会し、APIキーは不要です。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
9掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| limit | integer | いいえ | 返す指標候補の最大数です。 |
| query | string | はい | 自然言語の検索クエリ(例:「under-5 mortality」、「stunting」、「IMR」、「modelled estimates」)。略語、一般的な同義語、方法論に関する語句を指定できます。 |
| offset | integer | いいえ | ページネーションのオフセットです。返す前に、上位一致候補を指定数だけスキップします。`limit` と併用して、長い一致リストをページ分割できます(例:limit=20、offset=0 は 1 ページ目、offset=20 は 2 ページ目)。レスポンスエンベロープには `has_more` と `next_offset` が含まれ、LLM がページングを続けるかどうかを判断できます。 |
詳細
翻訳後に原文が更新されています。最新の内容は原文をご確認ください。
unicefstats-mcp
実験的なプロジェクトです。UNICEF の公式製品ではありません。出版物で引用する前に、取得した値をUNICEF データウェアハウスで確認してください。制限事項をご覧ください。
UNICEF の子どもの発達に関する統計を扱う MCP サーバーです。性別、年齢、富の五分位、居住地による内訳を含む、200 以上の国・地域の子どもに関する 790 以上の指標を検索できます。API キーは不要です。
指標は、子どもの死亡率、栄養、教育、子どもの保護、WASH(水・衛生設備・衛生習慣)、HIV/AIDS、予防接種、幼児期の発達などを対象としています。多くは SDG のターゲットに沿っていますが、データセットは SDG だけにとどまりません。
データソース:UNICEF SDMX API
基本情報
| 項目 | 値 |
|---|---|
| MCP ID | io.github.jpazvd/unicefstats-mcp |
| PyPI パッケージ | unicefstats-mcp |
| 正規ソース | github.com/jpazvd/unicefstats-mcp |
| データソース | SDMX REST API 経由の UNICEF データウェアハウス |
| メンテナー | Joao Pedro Azevedo (jpazvd) |
| ステータス | 実験的 — UNICEF の推奨を受けていません |
サードパーティのアグリゲーター(LobeHub、Smithery、mcp.so、Glama)の掲載情報は、メンテナーの管理下にありません。上記の正規ソースで確認してください。
目次
- unicefdata パッケージとの関係
- 他のデータ MCP との比較
- 概況:公的統計向け MCP サーバー
- sdmx-mcp との関係
- クイックスタート
- ツール
- デモ
- プロンプト
- ベンチマーク結果
- デプロイ
- 開発
- コントリビューション
- 制限事項とハルシネーションのリスク
- 来歴と所有権
- この MCP の確認方法
- ライセンス
主なドキュメント
| ドキュメント | 説明 |
|---|---|
| PROVENANCE.md | データの出所、所有権、配布パイプライン、検証手順 |
| CHANGELOG.md | 出典を明記したバージョン履歴(v0.1.0~v0.4.0) |
| RELEASE.md | リリースプロセスのチェックリストとバージョン管理 |
| CONTRIBUTING.md | 開発環境のセットアップ、コードスタイル、PR のガイドライン |
| CODE_OF_CONDUCT.md | Contributor Covenant v2.1 |
| examples/RESULTS.md | EQA 分解を含む、300 件のクエリによるベンチマークの詳細な分析 |
| examples/LITERATURE_REVIEW.md | 文献レビュー:公式統計向け MCP サーバー — エコシステム、パターン、評価、15 本の論文 |
| examples/LANDSCAPE.md | 20 の公式統計 MCP サーバーを比較 — タイムライン、機能マトリックス、強みと弱み |
| examples/results/related_work.md | 注釈付き文献目録 — ツール拡張によるハルシネーションに関する15本の論文 |
| examples/results/statistical_summary.md | ベンチマーク結果に対するWilcoxon検定、ブートストラップCI、McNemar検定 |
| examples/MCP-DIRECTORY-STATS.md | すべての公式統計 MCP サーバーを網羅したディレクトリ |
| examples/mcp-smoke-test/MULTIMODEL_SMOKETEST.md | v0.7.3 のプロバイダー間一般化に関する問いを検証する、モデル横断スモークテスト(Anthropic / OpenAI / Google / OpenRouter)— 設計、評価基準、約1ドルのデフォルト実行、完全な mini-EQA への道筋 |
unicefdata パッケージとの関係
unicefstats-mcp は、Python、R、Stata 向けの unicefdata パッケージの代替ではありません。それぞれ異なる利用者を対象としています。
| unicefstats-mcp | unicefdata (Python/R/Stata) | |
|---|---|---|
| 対象利用者 | AI アシスタント(Claude、Cursor、Copilot) | データサイエンティスト、研究者、アナリスト |
| インターフェース | MCP プロトコル(JSON によるツール呼び出し) | 各言語のネイティブ API(library()、import、ssc install) |
| ユースケース | 対話形式でのデータ探索、簡易な検索、AI 支援分析 | 再現可能な研究、ETL パイプライン、統計分析 |
| 出力 | LLM のコンテキスト向けに最適化された JSON(コンパクトまたはフル) | DataFrame、tibble、Stata 行列 |
| スクリプト作成 | いいえ — AI チャットを介した単一クエリ | はい — 完全なプログラム制御、ループ、結合、変換 |
| キャッシュ | unicefdata に委譲 | SDMX レスポンスのキャッシュを内蔵 |
| 一括ダウンロード | 制限あり(1回の呼び出しにつき最大500行) | 無制限 — データセット全体の取得向けに設計 |
内部の仕組みとしては、unicefstats-mcp は unicefdata Python パッケージをラップしています。各ツール呼び出しは、最終的に unicefdata.unicefData() またはそのメタデータ関数を呼び出します。MCP は、同じデータレイヤーの上に構築された、AI に使いやすい薄いインターフェースと考えてください。
使い分け:
- AI とチャットしながら、指標を素早く調べたり、値を確認したり、国を比較したりする場合は、unicefstats-mcp を使います
- スクリプトの作成、ダッシュボードの構築、回帰分析の実行、または再現可能な分析作業を行う場合は、unicefdata(Python/R/Stata)を使います
他のデータ MCP との比較
| 機能 | unicefstats-mcp | FRED MCP | World Bank MCP |
|---|---|---|---|
| ツール | 9(検索 → メタデータ → データ → コード → 識別情報 + 厳密な正規ルックアップ) | 3(参照 → 検索 → 取得) | 1(取得のみ) |
| 指標 | 子どもに焦点を当てた指標 790 以上 | 経済系列 800,000 以上 | 指標 約 1,600 件 |
| 国 | 200 以上(ISO3) | 米国中心(一部は国際) | 200 以上(ISO2) |
| 細分化項目 | 性別、年齢、富の五分位、居住地 | 頻度、季節調整 | なし |
| MCP プロンプト | compare_indicators | なし | なし |
| 出力モード | コンパクト(5 列)/フル(全列) | JSON | CSV |
| データの概要 | 値の範囲、年の範囲、国数 | なし | なし |
| ページネーションのメタデータ | total_rows_available と rows_returned | limit/offset | なし(20K にハードコード) |
| 入力検証 | ISO3、性別、富、居住地を検証 | Zod スキーマ | なし |
| エラーガイダンス | 次の手順を示す error + tip | HTTP ステータステキスト | 生の例外 |
| API キー | 不要 | FRED_API_KEY が必要 | 不要 |
| 切り捨て処理 | rows_truncated フラグ + フィルターのヒント | なし | なし |
全体像:公式統計向け MCP サーバー
このプロジェクトは、国際統計および公式統計向け MCP サーバーの拡大するエコシステムの一部です。2026 年 3 月現在:
国連機関
| サーバー | データソース | ツール | SDMX | 公開状況 |
|---|---|---|---|---|
| unicefstats-mcp(このリポジトリ) | UNICEF Data Warehouse | 7 | はい | PyPI |
| sdmx-mcp | 任意の SDMX レジストリ | 23 | はい | いいえ |
| unicef-datawarehouse-mcp | UNICEF Data Warehouse | 3 | はい | いいえ |
| mcp_unhcr | UNHCR 難民データ | 5 | いいえ | いいえ |
| medical-mcp | WHO GHO / FDA / PubMed | 18 | いいえ | npm |
国際機関
| サーバー | データソース | ツール | SDMX | 公開状況 |
|---|---|---|---|---|
| fred-mcp-server | FRED(系列 800K 以上) | 3 | いいえ | npm |
| world_bank_mcp_server | World Bank Open Data | 1 | いいえ | いいえ |
| imf-data-mcp | IMF(IFS、BOP、WEO) | 10 | はい | PyPI |
| OECD-MCP | OECD(データセット 5,000 件以上) | 9 | はい | npm |
| eurostat-mcp | Eurostat EU 統計 | 7 | はい | いいえ |
各国の統計局
| サーバー | データソース | ツール | 公開状況 |
|---|---|---|---|
| us-census-bureau-data-api-mcp | US Census Bureau(公式) | 5 | いいえ |
| us-gov-open-data-mcp | 米国政府の API 40 件以上 | 300 以上 | npm |
| ibge-br-mcp | ブラジル IBGE(テスト 227 件) | 22 | npm |
| ukrainian-stats-mcp-server | ウクライナ SDMX v3 | 8 | npm |
| istat_mcp_server | イタリア ISTAT SDMX | 7 | いいえ |
既知の不足分野
次の分野には MCP サーバーがありません:FAO/FAOSTAT、UNESCO/UIS(教育指標 4,000 件以上)、ILO/ILOSTAT、UNSD SDG API、UN DESA 人口統計、UNDP/HDI。
インストールコマンドを含むディレクトリ全体:MCP-DIRECTORY-STATS.md
sdmx-mcp との関係
UNICEF は、汎用的な SDMX プロトコル MCP サーバーである sdmx-mcp も管理しています。この 2 つのサーバーは競合するのではなく、相互に補完するものです。
| unicefstats-mcp(このリポジトリ) | sdmx-mcp | |
|---|---|---|
| 対象範囲 | UNICEF の子どもの発達データのみ | あらゆる SDMX レジストリ(UNICEF、Eurostat、OECD、...) |
| ツール | 7(アナリスト向け、4 ステップのワークフロー) | 23(SDMX のパワーユーザー向け、構造クエリ) |
| データ層 | unicefdata Python パッケージをラップ | httpx 経由で SDMX REST API を直接呼び出し |
| 出力 | LLM 向けにフォーマット済み(コンパクトな表、要約、ヒント) | 生の SDMX-JSON/CSV |
| 精度(EQA) | 0.891(v0.7.3 + 修正) | 0.074 |
| ハルシネーション | hall_b 1.00%(mcp060)/ 2.25%(mcp073)— ツールなしの hall_a ベースライン(2.50%)を下回る | 0% T1 / 0% T2 |
| クエリあたりのコスト | 約 $0.04 | $0.087 |
| レイテンシ | 平均約 10 秒 | 平均 60 秒 |
主なトレードオフ:unicefstats-mcp は、LLM による解析に最適化されたフォーマット済み出力により、はるかに高い精度を実現します(EQA 0.891 対 0.074)。sdmx-mcp は、強力な assistant_guidance フィールドと validate_query_scope パターンにより、データが存在しないクエリでのハルシネーションをゼロにしています。精度の下限が低すぎて実用的ではありませんが、回答を控える際の規律は模範的です。unicefstats-mcp v0.7.3 + 修正版は、データが存在しないクエリで MCP がツールなしのベースラインよりもモデルを安全にすることを実証した初のバージョンです(hall_b < hall_a)。これは sdmx-mcp のように精度を犠牲にせずに実現されています。
用途に応じた選択:
- UNICEF の子どもの発達に関する分析には unicefstats-mcp を使用してください。よりシンプルで高速かつ、はるかに高精度です。
- UNICEF 以外の SDMX レジストリへのクエリ、データフロー構造の調査、階層型コードリストの操作には sdmx-mcp を使用してください。
3 つの方式(LLM 単独、unicefstats-mcp、sdmx-mcp)の完全なベンチマーク:examples/results/
クイックスタート
pip install unicefstats-mcp
Claude Code
~/.claude/.mcp.json に追加します:
{
"mcpServers": {
"unicefstats": {
"command": "unicefstats-mcp"
}
}
}
Cursor / VS Code
MCP の設定に追加します:
{
"unicefstats": {
"command": "unicefstats-mcp"
}
}
v1.1.0 の追加内容
v1.1.0 は機能を追加する変更です。v1.0.0 の ambiguity_flag、candidates、abstain_instruction は、曖昧なクエリに対して従来どおり動作します。v1.1.0 では、その上に 4 つの新しい助言用エンベロープフィールドを追加しています。
requires_confirmation— サーバーがアシスタントにユーザー入力を求めて一時停止するよう促す場合は truerecommended— サーバーが推奨する次のアクション(コード、国、年、またはツール)assistant_guidance— LLM が言い換えて提示できる、短い自然言語のヒントnext_step— LLM が次の処理につなげられる、構造化されたツール/パラメーターの提案
判定順序(4 段階):厳密な正規ルックアップ → 曖昧さの確認(v1.0.0 のフィールド)→ 確認ゲート(requires_confirmation)→ 助言ヒント(recommended / assistant_guidance / next_step)。
判定:許可(動作の後退なし。助言フィールドは、行き詰まったクエリのペアで Sonnet の 23/30 件、Haiku の 26/30 件に対して動作します。internal/v1.1.0_design/ab_results.md を参照してください)。
ツール
| ツール | 目的 | API 呼び出し? |
|---|---|---|
search_indicators(query, limit) | キーワードで指標を検索 | いいえ |
list_categories() | テーマ別グループ(CME、NUTRITION、EDUCATION、...)を確認 | いいえ |
list_countries(region) | ISO3 コード付きで国を一覧表示 | いいえ |
get_indicator_info(code) | 完全なメタデータ、SDMX の詳細、利用可能な内訳 | いいえ |
lookup_by_code(code) | v1.0.0 厳密な正規コードのルックアップ(自然言語の入力を、回答を控える指示とともに拒否) | いいえ |
get_temporal_coverage(code) | 利用可能な年の範囲と国数 | はい(軽量) |
get_data(indicator, countries, ...) | 内訳フィルターを任意で指定して観測値を取得 | はい |
get_api_reference(language, function) | unicefdata パッケージの API リファレンス(Python/R/Stata) | いいえ |
get_server_metadata() | サーバーの識別情報、バージョン、来歴、データソース | いいえ |
ワークフロー
1. search_indicators("child mortality") → find indicator codes
2. get_indicator_info("CME_MRY0T4") → check disaggregations & SDMX details
3. get_temporal_coverage("CME_MRY0T4") → check year range
4. get_data("CME_MRY0T4", ["BRA", "IND"]) → fetch data
5. get_api_reference("python", "unicefData") → get code template to continue in a script
リソース
サーバーは、クライアントがガイダンスや参照データとして読み込める6つの MCP リソースを公開しています。
| URI | 目的 |
|---|---|
unicef://system-prompt | 推奨システムプロンプト — 運用ループ+時間的フロンティアの確認+外挿防止の指示(セッション開始時に読み込みます) |
unicef://llm-instructions | DO/DON'T ルール、よくある間違い、捏造防止のガイダンスの全文 |
unicef://context | 実行時コンテキスト — 時間に関するクエリの妥当性確認に使う current_date / current_year |
unicef://categories | 件数付きのすべての指標カテゴリ |
unicef://countries | ISO3 コードと国名 |
unicef://glossary | 内訳コードと指標プレフィックスの凡例 |
system-prompt と context リソースは、T2 のハルシネーション失敗モード(モデルがデータの最終年より先の年の値を捏造すること)に対処します。World Bank の data360-mcp サーバーから採用したパターンです。v0.5.0 の CHANGELOG エントリーを参照してください。
対象範囲:UNICEF DW 指標のみ
unicefstats-mcp は、UNICEF Data Warehouse の SDMX カタログを検索して提供します。死亡率、栄養、教育、児童保護、WASH、HIV/AIDS、予防接種、幼児期の発達を対象とする、子どもに焦点を当てた約790の指標が含まれています。指標コードは UNICEF の規則に従います(例:CME_MRY0T4、NT_ANT_HAZ_NE2、ED_ANAR_L1)。
他の組織のコードは対象外です。 これらは UNICEF の SDMX カタログに存在しないため、この MCP では検索、解決、取得できません。対象外となるコード体系の例:
| 提供元組織 | プレフィックスの例 | 一般的な内容 |
|---|---|---|
| World Bank WDI | SI.POV.DDAY、NY.GDP.PCAP.PP.KD、SE.PRM.NENR | 貧困、GDP、幅広い教育 |
| World Bank ASPIRE | per_allsp.cov_pop_tot、per_* | 社会的保護の対象範囲 |
| ILO / ILOSTAT | EIP_*、EAP_*、DF_*_SEX_RT | 労働、雇用、NEET |
| UNESCO UIS | UIS.* | 教育財政、学習成果 |
これらのコードは、search_indicators では検索結果が返らず、get_data では見つからないというエラーになります。これは正しい動作であり、バグではありません。
複数の組織にまたがるクエリには、関連する別の MCP を使用してください。
data360-mcp— WDI、ILO、UN、その他の公式プロバイダーを単一のツールインターフェースで扱う、World Bank のマルチソースアグリゲーターです。worldbank-mcp— World Bank Open Data のみを対象とします。
任意のレジストリ(Eurostat、OECD、各国の NSO)を対象とした SDMX のパワーユーザークエリについては、sdmx-mcp との関係で説明している汎用 SDMX プロトコルサーバー、sdmx-mcpを参照してください。
v9 のエッジテストサンプルで、正解コード(SI.POV.DDAY、NY.GDP.PCAP.PP.KD、per_allsp.cov_pop_tot)が UNICEF Data Warehouse ではなく World Bank の領域に属するプロンプトが3件見つかったことを受け、v1.1.1 で対象範囲の境界を明確化しました。詳細な報告書は internal/v1.1.0_design/ambiguity_forensic.md の C-4~C-6 節にあります(開発用リポジトリのみ)。
UNICEF 指標コードを理解する
これが重要な理由 — MCP のセマンティックレイヤー
UNICEF SDMX の指標コードは、初めて見ると暗号のように見えます — PT_F_20-24_MRD_U18、
NT_ANT_HAZ_NE2、TRGT_2030_IM_DTP3 — そして、このデータに対する LLM の失敗の多くは、
誤ったコードを選ぶことから始まります。この MCP が生の SDMX エンドポイントよりも提供する
最大の付加価値は、コードに含まれる意味構造を明らかにし、アシスタントが推測せずに
曖昧さを解消できるようにすることです。実装は src/unicefstats_mcp/differentiator.py(
セグメント単位の接尾辞の意味と、基本コード/バリアントの説明)および
src/unicefstats_mcp/indicator_resolver.py(自然言語の同義語と、既知の曖昧なトークン)
にあります。v1.1.1 では、クエリを考慮する CURATED_PREFERRED dimension_hint が追加され、
特定の表現に対して、ある系列のどのコードを提示するかをリゾルバーに伝えます(例:「target」
→ TRGT_*、「modelled」→ *_MOD、「child」→ 性別で細分化されたバリアントではなく、
合計の _T)。
このセクションでは、ユーザーや下流のエージェントがコードを直接読み取れるよう、また レビュー担当者がリゾルバーの選択を監査できるように、MCP が依拠する規則を説明します。
UNICEF コードの構造
UNICEF DW コードは、ドットを含まないアンダースコア区切りのセグメントを連結したもので、 左から右へ、最も広い意味から最も具体的な意味へと読みます。カタログにある、複数の要素から 成る保護指標を例にします。
PT_F_20-24_MRD_U18
│ │ │ │ │
│ │ │ │ └── Marriage cutoff: U18 = first union before age 18 (SDG 5.3.1)
│ │ │ └────── Indicator class: MRD = ever-married / in-union
│ │ └──────────── Age band (cohort): 20-24 = women 20-24 (retrospective denominator)
│ └────────────── Population restriction: F = female-only indicator (women/girls)
└───────────────── Family prefix: PT = Child Protection
声に出して読むと、「児童保護/女性の回答者/20~24 歳のコホート/婚姻経験あり/18 歳未満」
となります。つまり、初婚年齢が 18 歳未満だった20~24歳の女性の割合です。ここでの F は、
性別に中立な親コードに付加された性別細分化の接尾辞ではありません。女性の回答者のみを
対象とする指標群(FGM、児童婚、女性の貧血、産前ケア)に組み込まれた、対象者を制限する
マーカーです。詳しくは、以下の「対象者の制限と性別細分化」を参照してください。
同じ左から右への読み方は、栄養状態の身体計測パターンにも当てはまります。
NT_ANT_HAZ_NE2
│ │ │ │
│ │ │ └── Threshold: NE2 = below -2 SD (NE = "negative end", 2 = SD count)
│ │ └────── Metric: HAZ = Height-for-Age Z-score
│ └────────── Sub-family: ANT = Anthropometry
└───────────── Family: NT = Nutrition
NT_ANT_HAZ_NE2 は、5 歳未満の子どもの発育阻害の有病率を示す指標です。性別ごとの値を
取得するには、コードに _F を付けるのではなく、SEX ディメンションのフィルターを指定して
指標をクエリします(get_data(indicator='NT_ANT_HAZ_NE2', sex='F')。詳しくは次の項を参照してください。
そして、v1.1.1 のクエリを考慮したスコアリングが特に調整されている、派生指標のパターンです。
TRGT_2030_IM_DTP3
│ │ │ │
│ │ │ └──── Antigen / dose: DTP3 = third dose of DTP
│ │ └─────── Family: IM = Immunization
│ └──────────── Target year: 2030 = SDG horizon
└───────────────── Derived metric: TRGT = country-set target value
系列 → サブ系列 → 指標 → 閾値/年齢区分 → 細分化トークンという組み合わせの読み方は、 カタログ内のほぼすべてのコードに共通する、明文化されていない取り決めです。以下の表で各要素を 列挙します。
トピックのプレフィックス(ファミリー)
最初のセグメントはトピックファミリーを表します。カタログ内の上位10〜12個のプレフィックスで、子どもに関する指標の大部分を網羅できます。
| プレフィックス | 意味 | コードの例 |
|---|---|---|
CME | 子どもの死亡率推計 — 年齢区分別の死亡率(新生児、乳児、5歳未満、児童期、死産) | CME_MRY0T4(5歳未満児死亡率)、CME_SBR(死産率) |
NT | 栄養 — 身体計測、貧血、出生体重、微量栄養素 | NT_ANT_HAZ_NE2(発育阻害)、NT_BW_LBW(低出生体重) |
ED | 教育 — ISCED レベル別の修了率、識字率、出席率 | ED_CR_L1(初等教育修了率)、ED_15-24_LR(若者の識字率) |
WS | WASH — 水、衛生設備、衛生習慣。人口レベルの利用状況 | WS_PPL_W-SM(安全に管理された水) |
IM | 予防接種 — 抗原/接種回数別のワクチン接種率 | IM_BCG、IM_DTP3、IM_MCV1 |
MNCH | 母子保健 — 妊産婦健診、専門技能を持つ介助者による出産、早期出産 | MNCH_ANC1、MNCH_SAB、MNCH_BIRTH18 |
ECD | 幼児期の発達 — 学習教材、親による刺激、出席状況 | ECD_CHLD_LMPSL(学習教材) |
PT | 子どもの保護 — FGM、児童婚、暴力的なしつけ | PT_F_20-24_MRD_U18(18歳未満での結婚) |
HVA | HIV/AIDS — ART のカバー率、有病率、青少年に関する指標 | HVA_ADOL_ART_RECEIVE |
PV | 子どもの貧困 — 金銭的貧困および多次元貧困 | PV ファミリー |
COD | 死因 — 疾患や状態別の死亡率/罹患率 | COD_ACUTE_HEPATITIS_A |
DM | 人口統計 — 世帯構成、人口構造 | DM_HH_U18(18歳未満の構成員がいる世帯) |
MG | 移住 — 子どもの移住者、避難 | MG ファミリー |
GN | ジェンダー/思春期の女子(多くの場合、NT と横断的に関連) | GN_ANEMIA_ADOL_GRL |
TRGT | 国別目標(下記の「派生指標」を参照) | TRGT_2030_* |
HAZARD | ハザードへの曝露(気候、紛争、災害) | HAZARD ファミリー |
自然言語のフレーズとこれらのプレフィックスの完全な対応表は、
indicator_resolver._SYNONYMS にあります。例:「発育阻害」→ NT_ANT_HAZ_NE2、「児童婚」→ PT_F_20-24_MRD_U18、「BCG」→ IM_BCG。
方法論と出典を示すサフィックス
末尾のセグメントは、測定対象ではなく、値の算出方法を示すことがよくあります。これらのサフィックスは、v1.1.1 のクエリ対応スコアリングの要です。ユーザーが求めるのは、ほぼ常に「調査」または「モデル推計」のどちらかであり、両方を求めることはほとんどないためです。
| サフィックス | 意味 | コードの例 |
|---|---|---|
_MOD | モデル推計値(共同推計グループによる出力。例:教育の UIS、死亡率の IGME) | ED_CR_L1_UIS_MOD(モデル推計による初等教育修了率) |
_MERGE | 複数の調査/年のデータを統合し、比較可能な単一の時系列にしたもの | ECD_CHLD_LMPSL_MERGE |
_PRXY | 代理指標 — 概念上の厳密な指標の代わりに使われる関連変数 | ECD_CHLD_LMPSL_PRXY |
_NEW | 新しい/改訂された方法論による時系列(多くの場合、1サイクルの間、従来の時系列と並行して提供) | *_NEW |
_NUMTH | 分子/しきい値のバリエーション — 一部の機関が使用する別の基準 | *_NUMTH |
_AGG | 集計値(国別の観測値ではなく、地域または所得グループ別の集計) | *_AGG |
_UIS | UNESCO Institute for Statistics のデータソース/方法論 | ED_CR_L1_UIS_MOD |
MCP の differentiator.py:_SUFFIX_MEANINGS テーブルが正式な参照元です。
2つのコードがこの末尾のセグメントだけ異なる場合、explain_difference() はそれらを基本形とバリエーションとして報告します(例:ECD_CHLD_LMPSL が基本形、_MERGE と _PRXY が派生バリエーション)。
対象集団の制限と性別による細分
この違いは見落としやすく、後続のエージェントが頻繁につまずく点です。
対象集団の制限(コードに組み込まれています)。 一部のUNICEF指標は、基礎となる測定が一方の性別にのみ適用されるため、片方の性別についてしか存在しません。たとえば、FGMの有病率、児童婚のコホート、妊娠可能年齢の女性の貧血、妊産婦健診の受診率などです。こうした指標群では、コードの先頭付近にあるFセグメント(PT_F_*、NT_ANE_WOM_*、MNCH_BIRTH18、妊産婦健診のコード)は、指標の識別情報の一部である対象集団の制限を示すマーカーです。児童婚にはPT_M_20-24_MRD_U18に相当するコードはありません。この指標は女性の回答者を対象として定義されているためです。ここでのFは、細分化の切り替えではなく、指標名の一部として扱ってください。
性別による細分(クエリ時のSEXディメンションのフィルター)。 5歳未満児死亡率、初等教育修了率、発育阻害、識字率のように、両方の性別について定義されている指標では、性別はコードに含まれません。これは独立したSDMXディメンションであるSEXディメンションで、値はF、M、_T(合計)です。クエリ時に対象となる範囲を選択します。
get_data(indicator='CME_MRY0T4', sex='F') # under-5 mortality, girls
get_data(indicator='CME_MRY0T4', sex='M') # under-5 mortality, boys
get_data(indicator='CME_MRY0T4', sex='_T') # under-5 mortality, total
differentiator.py:_SUFFIX_MEANINGSテーブルでは、F、M、_T、MFが性別トークンの意味として列挙されています。これらはSEXディメンションの値を示すものであり、任意のコードに付加するサフィックスではありません。もともと含まれていないコードに_Fを付けても(たとえばNT_ANT_HAZ_NE2_Fを作っても)、解決されません。カタログにそのようなコードは含まれていません。
年齢・富・居住地による細分化トークン
細分化トークンは、コードに埋め込まれる場合(PT_F_20-24_MRD_U18のように、標準的な定義の一部である場合)と、get_data()のフィルターでクエリ時に適用する場合があります。以下のトークンは、どちらの場合も同じです。
年齢区分
埋め込み形式では年齢はLOW-HIGH(両端を含む)で表され、またはコード末尾の境界トークンで表されます。
| トークン | 意味 |
|---|---|
15-19、20-24、15-49 | 年単位の年齢区分(両端を含む) |
Y0 | 1歳未満(新生児/乳児の区分) |
Y0T4 | 0歳から4歳まで(両端を含む、5歳未満) |
Y1T4 | 1歳から4歳まで(両端を含む、乳児期以降の小児期) |
U5、U15、U18 | 「未満」の閾値 — 指定された年齢に達していない |
ADOL | 青少年(10~19歳、場合によっては10~24歳) |
富の五分位(クエリ時のフィルター)
| トークン | 意味 |
|---|---|
Q1 | 最低五分位(最も貧しい20%) |
Q2、Q3、Q4 | 中間の五分位 |
Q5 | 最高五分位(最も裕福な20%) |
B20 / B40 | 下位20% / 下位40% |
T20 | 上位20% |
居住地(クエリ時のフィルター)
| トークン | 意味 |
|---|---|
_T | 合計 |
U | 都市部 |
R | 農村部 |
身体計測のZスコアの閾値
これらはNT_ANT_*の指標群に含まれますが、命名規則が直感的ではないため、独立した表にまとめています。
| トークン | 意味 |
|---|---|
NE2 | -2 SD未満(「負の端、2 SD」)— 中等度または重度の区分 |
NE3 | -3 SD未満 — 重度の区分 |
NE2_T_NE3 | -3 SDから-2 SDまで — 中等度のみの区分 |
PO2 | +2 SD超 — 過体重側 |
HAZ / WAZ / WHZ / BAZ | 身長年齢別 / 体重年齢別 / 身長体重別 / BMI年齢別のZスコア |
派生指標:TRGT_ / _ARR_ / _PRJ
3つの特殊な文法は、観測値ではなく、観測値の変換値であることを示します。これらは、v1.1.1 のクエリ対応型 CURATED_PREFERRED スコアリングが最も重要となるケースです。ARR は末尾のサフィックスではなく、中間セグメントのトークンである点に注意してください(例:CME_ARR_U5MR、CME_ARR_SBR)。
| パターン | 意味 | 例 |
|---|---|---|
TRGT_<year>_<indicator> | 指定された期間年における、指定された指標の国別目標値です。TRGT_2030_IM_DTP3 は、DTP3 接種率のその国の 2030 年の目標値であり、観測値ではありません。 | TRGT_2030_IM_DTP3 |
*_ARR_* | 年間減少率 — 基礎となる時系列から算出された年率換算の変化率です。中間セグメントのトークンとして現れます。 | CME_ARR_U5MR、CME_ARR_SBR |
*_PRJ / *_PRJ_* | 観測値ではなく、予測値または推計値です。 | PT_F_20-24_MRD_U15_PRJ |
v1.1.1 のクエリ対応型スコアリング(コミット 7112e1d):MCP は、自然言語クエリに target、goal、objective、または期間年が含まれる場合にのみ、TRGT_* コードを表示します。「ブラジルの DTP3 接種率」というだけの質問では観測時系列が選ばれ、「ブラジルの 2030 年の DTP3 目標値」と尋ねると TRGT_2030_IM_DTP3 が選ばれます。これは、differentiator.py の CURATED_PREFERRED エントリーにヒントフィールドを設定することで実装されており、完全な除外ではありません。目標値コードは直接検索すれば引き続き見つかりますが、クエリで意図が示されない限り、リゾルバーのランキングでは優先度が下がります。
同じクエリ対応型の優先度低下は、_MOD(モデル化)バリアントにも適用されます。survey、raw、observed を含むクエリではサフィックスなしのコードが優先され、modelled、estimate、joint estimation を含むクエリでは _MOD が優先されます。
教育レベル
ED_* ファミリーでは、ISCED レベルは L1 / L2 / L3 と略記されます。
| トークン | ISCED レベル | 一般的な名称 |
|---|---|---|
L1 | ISCED 1 | 初等教育 |
L2 | ISCED 2 | 前期中等教育 |
L3 | ISCED 3 | 後期中等教育 |
例:ED_ANAR_L1(調整済み純出席率、初等教育)、ED_ANAR_L2
(前期中等教育)、ED_CR_L1(修了率、初等教育)。コードが L1 で終わる場合は初等教育のみを示します。2つのレベルが同時に報告される場合、コードは連結されず、個別に記載されます。
適用範囲に関する注意。 L<n> = ISCED <n> の対応関係が成り立つのは、ED_* ファミリー内のみです。ED_* 以外では、L<n> が ISCED 以外のレベルを表す場合があります。たとえば、PV_CHLD_MPI_L1 と PV_CHLD_MPI_L2 の L1 / L2 は、それぞれ多次元貧困による深刻な剥奪と中程度の剥奪を意味します。また、一部の ED_* コードでは、ISCED 1 より下位に位置する乳幼児期または就学前のレベルを表すために、2桁形式の L01 / L02 も使用されます。L<n> が初等教育/前期中等教育/後期中等教育を意味すると決めつける前に、必ず指標名を確認してください。
MCP での定義箇所
上記で説明した規約は、単なる俗説ではありません。MCP のソースに定義されており、直接確認できます。
src/unicefstats_mcp/differentiator.pyは、セグメント単位の意味を示す標準的な参照先です。_SUFFIX_MEANINGSテーブルは、認識される末尾トークンをすべて人間が読める説明に対応付けます。explain_difference()は 2 つのコードを並べて確認し、異なる各セグメントにラベルを付けます。CURATED_PREFERREDテーブルには、v1.1.1 のクエリ対応型スコアリングを制御する、指標ごとのdimension_hint文字列が含まれています。src/unicefstats_mcp/indicator_resolver.pyは、自然言語の表現を標準コードに対応付けます。_SYNONYMSは一般的なケース(「発育阻害」、「5 歳未満の死亡率」、「児童婚」)を扱います。_AMBIGUOUSは、複数のコードに正当に対応し、ユーザーによる曖昧さの解消が必要な表現を示します。_DISAMBIGUATION_TIPSには、v1.1.0 で追加されたassistant_guidanceエンベロープフィールドに表示される短いヒントが含まれています。unicef://glossaryMCP リソース — セッション開始時にリソースを読み込むクライアントは、この README を解析しなくても、細分化コードと指標プレフィックスの凡例を取得できます。
リゾルバーがコードを選ぶまでの流れは次のとおりです。自然言語のクエリ →
indicator_resolver による検索 → 曖昧な場合は _AMBIGUOUS の該当項目によって v1.0.0 の ambiguity_flag と候補リストを返す → CURATED_PREFERRED の項目に一致する場合、dimension_hint によって候補の順位を調整する → 選ばれたコードに対し、differentiator.py が assistant_guidance フィールド用の注釈を付けます。各手順はソースで確認でき、このセクションには LLM 側の経験則による処理はありません。
デモ
ステップ 1:指標を検索する
>>> search_indicators("stunting", limit=3)
{
"query": "stunting",
"total_matches": 11,
"showing": 3,
"results": [
{"code": "FD_STUNTING", "name": "Moderate and severe stunting (Functional difficulties)"},
{"code": "NT_ANT_HAZ_NE2", "name": "Height-for-age <-2 SD (stunting)"},
{"code": "NT_ANT_HAZ_NE3", "name": "Height-for-age <-3 SD (severe stunting)"}
],
"tip": "Use get_indicator_info('FD_STUNTING') for full details including available disaggregations."
}
ステップ 2:指標のメタデータを取得する
>>> get_indicator_info("CME_MRY0T4")
{
"code": "CME_MRY0T4",
"name": "Under-five mortality rate",
"description": "Probability of dying between birth and exactly 5 years of age, expressed per 1,000 live births",
"dataflow": "GLOBAL_DATAFLOW",
"sdmx_api": "https://sdmx.data.unicef.org/ws/public/sdmxapi/rest/data/UNICEF,GLOBAL_DATAFLOW,1.0/.CME_MRY0T4?format=csv",
"disaggregation_filters": {
"sex": ["_T (Total)", "M (Male)", "F (Female)"],
"wealth_quintile": ["Q1 (Lowest)", "Q2", "Q3", "Q4", "Q5 (Highest)"],
"residence": ["_T (Total)", "U (Urban)", "R (Rural)"]
}
}
ステップ 3:時系列のカバー範囲を確認する
>>> get_temporal_coverage("CME_MRY0T4")
{
"code": "CME_MRY0T4",
"start_year": 1931,
"end_year": 2024,
"latest_year": 2024,
"countries_with_data": 249,
"note": "Not all countries have data for all years. Coverage varies by country."
}
ステップ 4:データを取得する
>>> get_data("CME_MRY0T4", ["BRA", "IND", "NGA"], start_year=2018, end_year=2023)
{
"indicator": "CME_MRY0T4",
"countries_requested": ["BRA", "IND", "NGA"],
"total_rows_available": 18,
"rows_returned": 18,
"rows_truncated": false,
"format": "compact",
"summary": {
"value_range": {"min": 14.42, "max": 117.56, "mean": 54.78},
"year_range": {"earliest": 2018, "latest": 2023},
"countries_in_result": 3
},
"data": [
{"iso3": "BRA", "country": "Brazil", "period": 2018, "indicator": "CME_MRY0T4", "value": 15.22},
{"iso3": "BRA", "country": "Brazil", "period": 2019, "indicator": "CME_MRY0T4", "value": 15.03},
{"iso3": "BRA", "country": "Brazil", "period": 2020, "indicator": "CME_MRY0T4", "value": 14.87},
{"iso3": "BRA", "country": "Brazil", "period": 2021, "indicator": "CME_MRY0T4", "value": 14.72},
{"iso3": "BRA", "country": "Brazil", "period": 2022, "indicator": "CME_MRY0T4", "value": 14.59},
{"iso3": "BRA", "country": "Brazil", "period": 2023, "indicator": "CME_MRY0T4", "value": 14.42},
{"iso3": "IND", "country": "India", "period": 2018, "indicator": "CME_MRY0T4", "value": 36.87},
{"iso3": "IND", "country": "India", "period": 2019, "indicator": "CME_MRY0T4", "value": 34.86},
{"iso3": "IND", "country": "India", "period": 2020, "indicator": "CME_MRY0T4", "value": 32.98},
{"iso3": "IND", "country": "India", "period": 2021, "indicator": "CME_MRY0T4", "value": 31.19},
{"iso3": "IND", "country": "India", "period": 2022, "indicator": "CME_MRY0T4", "value": 29.53},
{"iso3": "IND", "country": "India", "period": 2023, "indicator": "CME_MRY0T4", "value": 27.99},
{"iso3": "NGA", "country": "Nigeria", "period": 2018, "indicator": "CME_MRY0T4", "value": 117.19},
{"iso3": "NGA", "country": "Nigeria", "period": 2019, "indicator": "CME_MRY0T4", "value": 117.37},
{"iso3": "NGA", "country": "Nigeria", "period": 2020, "indicator": "CME_MRY0T4", "value": 117.42},
{"iso3": "NGA", "country": "Nigeria", "period": 2021, "indicator": "CME_MRY0T4", "value": 117.56},
{"iso3": "NGA", "country": "Nigeria", "period": 2022, "indicator": "CME_MRY0T4", "value": 117.46},
{"iso3": "NGA", "country": "Nigeria", "period": 2023, "indicator": "CME_MRY0T4", "value": 116.82}
]
}
AI アシスタントがこのデータから抽出する主な知見は次のとおりです。
- ブラジル:1,000 人あたり 14.4 人 — 着実に減少しており、SDG 3.2 の目標(≤25)達成に向けて順調です
- インド:1,000 人あたり 28.0 人 — 急速に改善しています(5 年間で 37 から 28 に減少)。最近 SDG の目標を下回りました
- ナイジェリア:1,000 人あたり 117 人 — 実質的に横ばいで、SDG の目標の 4.7 倍にあたる、最も大きな負担を抱えています
ステップ 5:スクリプトで処理を続けるためのコードテンプレートを取得する
>>> get_api_reference("r", "unicefData")
{
"language": "r",
"install": "install.packages(\"unicefdata\")",
"import": "library(unicefdata)",
"function": "unicefData",
"signature": "unicefData(\n indicator = NULL, # character — indicator code(s)\n countries = NULL, # character vector — ISO3 codes, NULL = all\n year = NULL, # numeric, character (\"2015:2023\"), or vector\n sex = \"_T\", # character — \"_T\", \"M\", \"F\"\n totals = FALSE, # logical — only return aggregate totals\n tidy = TRUE, # logical — standardize column names\n country_names = TRUE, # logical — add country name column\n format = \"long\", # character — \"long\", \"wide\", \"wide_indicators\"\n latest = FALSE, # logical — most recent value per country\n circa = FALSE, # logical — closest available year\n add_metadata = NULL, # character vector — e.g. c('region', 'income_group')\n dropna = FALSE, # logical — drop rows with missing values\n simplify = FALSE, # logical — minimal columns\n mrv = NULL, # integer — most recent N values per country\n raw = FALSE, # logical — all disaggregations, no filtering\n)",
"returns": "tibble with columns: indicator_code, iso3, country, period, value, sex, age, wealth_quintile, residence, ...",
"examples": [
{"description": "Under-5 mortality for Brazil, India, Nigeria (2015–2023)", "code": "df <- unicefData(\"CME_MRY0T4\", countries = c(\"BRA\", \"IND\", \"NGA\"), year = \"2015:2023\")"},
{"description": "Latest stunting data for all countries", "code": "df <- unicefData(\"NT_ANT_HAZ_NE2\", latest = TRUE)"},
{"description": "Wide format with region metadata", "code": "df <- unicefData(\"CME_MRY0T4\", format = \"wide\", add_metadata = c(\"region\", \"income_group\"))"}
]
}
これにより、AI は正確なパラメーター名と構文を使って、正しい R/Python/Stata コードを生成できます。トレーニングデータから推測する必要はありません。
get_data のパラメーター
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
indicator | str | required | 指標コード |
countries | list[str] | required | ISO3 コード(最大 30) |
start_year | int | None | 年の範囲の開始年 |
end_year | int | None | 年の範囲の終了年 |
sex | str | "_T" | "_T"(合計)、"M"(男性)、"F"(女性) |
wealth_quintile | str | None | "Q1"–"Q5"、"B20"、"B40"、"T20" |
residence | str | None | "U"(都市部)、"R"(農村部)、"_T"(合計) |
format | str | "compact" | "compact"(5 列)または "full"(全列) |
limit | int | 200 | 最大行数(1–500) |
レスポンスの機能
summary:値の範囲(最小値/最大値/平均値)、年の範囲、国の数disaggregations_in_data:有意なばらつきがある次元total_rows_availableとrows_returned:ページネーションのメタデータtip:次の手順や結果の絞り込みに関する状況に応じたガイダンス
プロンプト
compare_indicators
構築済みの分析ワークフローです。指標のメタデータとデータを取得し、構造化された比較を作成します。
compare_indicators(indicator="CME_MRY0T4", countries="BRA,IND,NGA", start_year="2015", end_year="2023")
write_unicefdata_code
unicefdata パッケージを使って、実行可能な Python、R、または Stata コードを生成します。AI は get_api_reference() を呼び出して正確な関数シグネチャを取得し、ユーザーのタスクに合ったコードを記述します。
write_unicefdata_code(
task="Compare under-5 mortality for Brazil and India, 2015-2023, then plot the trends",
language="r"
)
これにより、会話形式での探索(MCP ツール経由)と、再現可能な分析スクリプト(unicefdata パッケージ経由)の間のギャップを埋めます。
ベンチマーク結果
EQA 指標を用いて、MCP とツールなしのベア LLM(Claude Sonnet 4)をベンチマークしました。10 の指標、20 か国、2 種類のプロンプト、2 種類のハルシネーションテストカテゴリにわたる 300 件のクエリを対象としています。
現行の正規スコア(v0.7.3 + 修正、2026 年 5 月)
以下の数値は、現行の正規スコアです。(a)v0.7.3 のサイクルで行った 4 件のエンジニアリング修正(CHANGELOG を参照)と、(b)拒否表現を考慮する v1.4 エクストラクターによる採点修正を反映しています。両方のサンプル(mcp060:40 か国、mcp073:重複しない 20 か国の検証サンプル)は、同じ v1.4 のルールで採点されています。
| 指標 | LLM のみ(ツールなし) | LLM + MCP(v0.7.3 + 修正) | サンプル |
|---|---|---|---|
| POS EQA 平均 | 0.121 | 0.891 | mcp060(40 か国) |
| POS EQA 平均 | 0.121 | 0.909 | mcp073(重複しない 20 か国) |
| hall_b 合計(T1+T2) | 2.50%(hall_a) | 1.00% | mcp060 |
| hall_b 合計(T1+T2) | 2.50%(hall_a) | 2.25% | mcp073 |
| MCP によりモデルの安全性が向上(hall_b < hall_a) | — | はい — 両方のサンプルで | 両方 |
v0.7.3 + 修正は、データが存在しないクエリにおいて、MCP がツールなしのベースラインよりもモデルの安全性を高めることを実証した最初のバージョンです。 v0.7.2 までは hall_b ≥ hall_a であり、安全性レイヤーはハルシネーションの度合いを抑えても、発生率は下げていませんでした。この特性を逆転させた 4 件の修正:
server.py:_seed_data_frontier_cache— 無条件の上書きではなく単調増加の最大値を使用(プローブによるキャッシュ済みフロンティアの後退によって、現在のデータが利用できないと LLM に伝わっていました)。server.py:get_dataの例外ハンドラー —unicefdataのカスケード処理が枯渇した場合をerrorではなくno_dataに再分類し、LLM がツールの失敗ではなく、権威あるデータの不在として扱うようにしました。benchmark_eqa_batch.py— ツールのresult_strをstate.tool_callsに保存し、v1.4 エクストラクターが拒否表現を認識できるようにしました。benchmark_eqa_batch.py— 同期ランナーと同等の、拒否表現を尊重する処理を追加しました。
正規スコア:バージョン間の全比較表(修正後の 4 件の訂正と mcp073 の第 2 サンプルによる検証を含む)については、CHANGELOG.md 冒頭の [Unreleased] §Fixed ブロックを参照してください。実行ごとの詳細な報告は、開発用リポジトリ(jpazvd/unicefstats-mcp-dev、開発専用で公開ミラーとは同期されません)の internal/v0_7_3_validation.md と internal/v0_7_3_second_sample_validation.md にあります。
過去の結果:v0.3.0(n=600、2025 年)および v0.7.2(n=500、同日実施、2026-05-08)
当初の v0.3.0 ベンチマークでは、POS EQA が 0.147 → 0.990(6.7 倍)、T2 ハルシネーションが 11% → 37% と報告されました。その後、2 件の訂正がありました。
- 「37%」という見出しの数値は、主に v1.3 エクストラクターの採点上のアーティファクトでした。エクストラクターは、明示的な拒否の中で
no_dataツールの結果から引用された値も含め、回答内で言及された数値をすべて「主張」として数えていました。v1.4 エクストラクター(_detect_refusal)では、こうした回答は適切な拒否として再分類されます。v0.3.0 の Parquet ファイルは保管済みのため、v1.4 で再採点していません。「37%」に相当する v1.4 の数値は不明ですが、大幅に低いと考えられます。 - v0.7.2 の再現(n=500、2026-05-08)では、v1.3 の採点で POS EQA 0.897、T1+T2 のハルシネーション合計 13% と報告されました。同じ Parquet ファイルを v1.4 で採点すると、POS EQA は 0.793、hall_b は 3.75% です。
精度に関する見出しの数値(約 7 倍の向上)は、再採点を経ても一貫して維持されています。ハルシネーションに関する見出しの数値を改善するには、MCP がツールなしのベースラインを下回るまでハルシネーションを実際に減らすために、採点の修正(v1.4 エクストラクター)とサーバーの修正(v0.7.3 のキャッシュおよびカスケード処理の修正)の両方が必要でした。
EQA の内訳(baseline_latest プロンプト)
| 要素 | LLM のみ | LLM + MCP | 向上幅 |
|---|---|---|---|
| ER(抽出率) | 0.50 | 1.00 | +0.50 |
| YA(年の正確性) | 0.24 | 0.99 | +0.75 |
| VA(値の正確性) | 0.37 | 1.00 | +0.63 |
| EQA = ER × YA × VA | 0.147 | 0.990 | +0.843 |
主な調査結果
-
MCP を使用した場合、EQA が 0.95 以上の指標は 10 個すべてで、重複のない 40 か国(R1 + R2)にわたって再現されました。10 個中 7 個は EQA = 1.000 を達成しています。
-
年の正確性は、LLM 単体の最大の弱点です(YA = 0.24)。IGME 2024 の推定値があるにもかかわらず、2021~2022 年を「最新」として提示します。MCP は API にクエリを送信し、実際の最新年を返します。
-
直接プロンプトでは MCP による改善幅が大きくなります(+0.722 対 +0.613)。これは YA を排除し、純粋な検索精度を切り分けるためです。
-
T2 のハルシネーション(約 37%)は、正解データの誤分類によって過大評価されています。SDMX API には小国の IGME 死亡率データがありますが、正解データの作成パイプラインでは見落とされていました。修正後のハルシネーション率は、MCP が約 10%、LLM 単体が約 5%です。残るハルシネーションは確信効果によるものです。Claude は、強いドメイン上の事前知識があると、ツールのエラーを覆します。
-
確信効果:MCP ツールが「データなし」と返しても、LLM に強いドメイン上の事前知識がある場合(例:よく知られた国の乳幼児死亡率)、ツールの応答を覆して、依然としてデータを捏造します。これは MCP 固有のものではなく、LLM の根本的な振る舞いです。
3 者比較(sdmx-mcp との比較)
| 指標 | LLM 単体 | unicefstats-mcp(v0.7.3 + 修正) | sdmx-mcp |
|---|---|---|---|
| EQA(POS) | 0.121 | 0.891 | 0.074 |
| hall_b 合計(T1+T2) | hall_a 2.50% | 1.00%(mcp060) / 2.25%(mcp073) | 0% |
| MCP はツールなしより安全か? | — | はい | はい(設計上ゼロ) |
| クエリあたりのコスト | 約 $0.003 | 約 $0.04 | $0.087 |
| 平均レイテンシ | 約 5 秒 | 約 10 秒 | 60 秒 |
sdmx-mcp の生の SDMX-JSON 出力は LLM にとって解析が難しい(VA ≈ 0.11)一方、ハルシネーション防止のガードレールは非常に効果的です(捏造率 0%)。詳細については、「sdmx-mcp との関係」を参照してください。
詳細な分析、指標ごとの内訳、方法論:examples/RESULTS.md
ベンチマークデータ(LLM の全応答を含む parquet):examples/results/
ベンチマーク設計の根拠:examples/DESIGN_ISSUES.md
ベンチマークの再現
# Build ground truth from UNICEF SDMX API
python examples/00_build_ground_truth.py
# Run 200-query benchmark (requires ANTHROPIC_API_KEY, ~$6)
python examples/benchmark_eqa.py
# Add 100 direct-prompt queries to existing run (~$3)
python examples/01_run_direct_supplement.py
引用
このベンチマークでは、次の EQA 指標を使用しています。
Azevedo, J.P. (2025). "AI Reliability for Official Statistics: Benchmarking Large Language Models with the UNICEF Data Warehouse." UNICEF Chief Statistician Office. github.com/jpazvd/unicef-sdg-llm-benchmark-dev
デプロイ
ローカル(stdio)
unicefstats-mcp
リモート(SSE)
unicefstats-mcp --transport sse --port 8000
Docker
docker build -t unicefstats-mcp .
docker run -p 8000:8000 unicefstats-mcp
開発
pip install -e ".[dev]"
pytest tests/ -v
ruff check src/ tests/
mypy src/unicefstats_mcp/
コントリビューション
コントリビューションを歓迎します。
コントリビューションの方法
- バグ報告:再現手順を添えて issue を作成してください
- 機能リクエスト:issue を通じて、新しいツール、指標、出力形式を提案してください
- コード:フォークしてブランチを作成し、PR を送信してください。下記の開発環境のセットアップを参照してください
- ベンチマーク:さまざまなモデルで EQA ベンチマークを実行し、結果を共有してください
- ドキュメント:サンプルを改善し、誤字を修正し、ユースケースを追加してください
開発環境のセットアップ
git clone https://github.com/jpazvd/unicefstats-mcp.git
cd unicefstats-mcp
pip install -e ".[dev,benchmark]"
pytest tests/ -v
ruff check src/ tests/
mypy src/unicefstats_mcp/
プルリクエストのガイドライン
- PR ごとに 1 つの課題に絞る — 変更の範囲を絞り、レビューしやすくしてください
- 新しいツールやバグ修正にはテストを追加してください
- 送信前にリンター(
ruff check)と型チェッカー(mypy)を実行してください - ツールのシグネチャを変更した場合や新機能を追加した場合は、README を更新してください
- API キーや、500KB を超えるベンチマーク結果の parquet をコミットしないでください
優先対応領域
既知の問題については、監査結果をご覧ください。影響の大きい領域は次のとおりです。
- MNCH データフローのバグ:
unicefdataパッケージのデータフロー解決の問題により、MNCH_CSECとMNCH_BIRTH18の EQA が 0 になります - T2 の幻覚の低減:API が結果を返さない場合の捏造をさらに減らします(現在は約 10%。詳細は制限事項をご覧ください)
制限事項と幻覚のリスク
データの制限事項
- 指標、国、年によってデータのカバレッジにはばらつきがあります。調査に基づく指標(栄養、教育、保護)では、設計上、データポイントの間隔が 3~5 年空いています。
- 死亡率指標(CME_*)は、国連機関間グループ(IGME)によるモデル推定値であり、コンパクトな出力では不確実性区間が表示されません。
- すべての指標がすべての細分化ディメンションに対応しているわけではありません。各指標で利用可能な項目は
get_indicator_info()に表示されます。 get_data()の 1 回の呼び出しで取得できる行数は最大 500 行です。
幻覚のリスク
複数の国のサンプルを用いたベンチマークテスト(v0.7.3 + 修正、2026 年 5 月):
| 種類 | 説明 | 発生率(LLM のみ、hall_a) | 発生率(LLM + MCP、hall_b) | 備考 |
|---|---|---|---|---|
| T1(データ欠損年) | 指標にデータはあるものの、特定の年のデータがない場合に、LLM がその年の値を引用する | 約 1.0% | 0.00%(mcp060)/0.50%(mcp073) | ツールなしの場合より低い |
| T2(データの最終年より先) | LLM がデータの最終年より後の年の値を捏造する | 約 3.5% | 2.00%(mcp060)/4.00%(mcp073) | ツールなしの場合より低い |
| 合計 | T1 + T2 | hall_a 2.50% | 1.00%(mcp060)/2.25%(mcp073) | hall_b < hall_a — MCP により、より安全になります |
v0.7.3 + 修正は、MCP によってモデルがツールなしの場合より安全になった初のリリースです。 v0.7.2 まで(v1.4 のスコアリング)では hall_b ≥ hall_a でした。安全性レイヤーによって、安全性レイヤーなしの場合と比べて発生率は下がっていたものの、MCP の発生率がツールなしの場合を下回ることはありませんでした。
変更点:
_seed_data_frontier_cacheのキャッシュ汚染 — プローブルーチンが、たまたま返された年で指標のキャッシュ済みの最大年を上書きしており、キャッシュ済みの値を下回る場合がありました。その結果、実際の最終年が 2023 年の指標について、LLM には最終年が 2018 年だと伝えられ、パラメトリックメモリーから 2023 年について回答していました。修正:単調増加するmax()のみを使用。unicefdataのカスケードをerrorではなくno_dataとして扱う — 基盤となるラッパーでフォールバックデータフローが枯渇した際、その状態がツール例外として漏れており、LLM は「ツールに失敗したので、自分の知識に頼る」と解釈していました。現在は明確なno_dataシグナルとして分類され、安全性レイヤーが「推定しない」に変換します。上流での修正のため、unicefdata-dev#74を起票しました。- v1.4 抽出器(
_detect_refusal) — 回答内の数値は、LLM が明示的に拒否する際にno_dataのツール結果から引用した値も含め、すべて「主張」として数えられていた、長年のスコアリング上のアーティファクトを修正しました。これにより、v0.7.3 の修正前の再スコアリングで hall_b は約 37%から 2.25%に低下しました。過去の「MCP は悪化させる」という結果の大半は、振る舞いではなく抽出器に起因するものでした。 - バッチランナーの同等性 — 非同期バッチランナーにおける
result_strの永続化と、拒否の尊重。
この結果を踏まえても、回答を生成する経路をモデルに与えることによる構造的なコストについては、ツールで拡張された LLM に関する、より広範な文献を検討する余地があります。
- The Reasoning Trap: How Enhancing LLM Reasoning Amplifies Tool Hallucination(ICLR 2025)— この関係が因果的であることを示しています。モデルのツール使用能力が高まるにつれて、ツールの幻覚も能力に比例して増加します。
- Reducing Tool Hallucination via Reliability Alignment(Cao et al., 2024、arXiv:2412.04141)— この問題を、ツール選択の誤り(誤ったツールの選択、拒否の失敗)と、ツール使用の誤り(パラメーターの捏造)として形式化しています。
- ReDeEP: Detecting Hallucination in Retrieval-Augmented Generation via Mechanistic Interpretability(Sun et al., 2024)— LLM のパラメトリックな知識が、残差ストリーム内で取得したコンテキストを上書きすることを、メカニズムの面から示しています。
これらの結果は、構造的な傾向が実在することを示しています。一方、v0.7.3 + 修正の結果は、(a)セーフティレイヤーのアーキテクチャ、(b)サーバー側の適切な運用(古いフロンティアキャッシュを使用しないこと、データがないことをツールエラーとして漏らさないこと)、(c)誠実なスコアリングによって、特定のデータ領域ではこの傾向を逆転できることを示しています。
ユーザー向けの要点:
- セッション開始時に
unicef://system-promptとunicef://contextのリソースを読み込みます(フロンティアより先のデータの捏造に対処します)。 - MCP の結果は、絶対に誤りのない真実ではなく、ベストエフォートの情報取得として扱います。引用する前に、重要な値をUNICEF Data Warehouseで確認してください。
- 範囲を限定しないクエリ(「ナイジェリアの最新の5歳未満児死亡率」)よりも、年を明示したクエリ(「2023年のナイジェリアの5歳未満児死亡率」)を優先してください。データがない場合、後者のほうがより確実に拒否を促します。
- 残差の1.00% / 2.25%は Sonnet 4 のみで測定されています。次のベンチマークでは、モデル間での一般化を検証します。
ベンチマークの方法論の詳細:examples/RESULTS.md
出所と所有権
この MCP が提供するすべてのデータは、UNICEF Data Warehouseに由来し、公開 SDMX REST API を通じてリアルタイムで取得されます。観測データは保存もキャッシュもされません。get_data() を呼び出すたびに、SDMX リクエストがリアルタイムで実行されます。パフォーマンス向上のため、指標と国のレジストリは初回アクセス時にメモリ内へキャッシュされます。これらはカタログのメタデータであり、統計値ではありません。この MCP は LLM が利用しやすい形式に出力を整えますが、値は変更しません。
すべてのリリースは、PyPI Trusted Publishing(OIDC)を使用して GitHub Actions から公開されます。長期間有効な API トークンは存在しません。PyPI attestationsでリリースの出所を検証できます。
データの出所、所有権、配布パイプライン、解釈上の注意点の詳細については、PROVENANCE.mdを参照してください。
この MCP の検証方法
| 確認項目 | 方法 |
|---|---|
| ソース | GitHub 上のリポジトリは jpazvd/unicefstats-mcp です |
| パッケージ | pip show unicefstats-mcp を実行し、Home-page が正式なリポジトリを指していることを確認します |
| バージョン | python -c "import unicefstats_mcp; print(unicefstats_mcp.__version__)" を実行し、server.json および PyPI と照合します |
| 出所 | PyPI attestationsでは、各リリースを GitHub Actions のワークフローに関連付けています |
| 実行時 | get_server_metadata() を呼び出すと、正式な名前、バージョン、公開者、データソースが返されます |
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。