ilostat-mcp-server について
ILOSTATの労働統計を探索するMCPサーバーです。指標の検索、国別比較、プロフィール作成を行い、労働市場データを扱う分析者やエージェント向けに、報告値・モデル推計値・予測値を区別して出典情報も保持します。
主な機能
- 01指標の検索と説明
- 02複数データセットの観測値取得
- 03国別労働市場プロフィールの作成
- 04地域の比較と順位付け
- 05ILOSTAT参照コードの解読
- 06ステージデータへの読み取り専用SQL
活用シーン
- 01労働市場の課題に合うデータセット検索
- 02国ごとの失業率の比較
- 03国別の報告値とモデル推計値の確認
- 04SQLによる取得済み観測値の分析
MCP 対応
STDIOまたはStreamable HTTP経由で、指標クエリや任意のデータフレームSQLツールを含む9つのツールをMCPクライアントに提供します。公開ホスト型エンドポイントもあります。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://ilostat.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-ilostat https://ilostat.caseyjhand.com/mcp{"mcpServers":{"cyanheads-ilostat":{"type":"http","url":"https://ilostat.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-ilostat":{"type":"http","url":"https://ilostat.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-ilostat":{"type":"http","url":"https://ilostat.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-ilostat":{"serverUrl":"https://ilostat.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
8| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| limit | integer | いいえ | 1ページあたりのヒット数。最大 50 です。これを超える値(最大 1,000)が指定された場合は 50 として適用され、その旨が通知されます。 |
| query | string | いいえ | 「youth unemployment」や「informal employment rate」などの自然言語の用語です。大文字と小文字、アクセント記号、句読点は無視され、labor は labour と一致し、語尾の複数形の s は許容されます。カタログに語頭が一致する語がない場合は、語幹で照合されます(-ity、-ization、-ive、-ment、-ing、-ed、-ly、複数形の s を除去し、-ies は y として扱います)。フィルターで閲覧する場合は省略してください(その場合、結果は指標コード順に並びます)。 |
| cursor | string | いいえ | 不透明な継続トークンです。前のページの next_cursor を変更せずに渡してください。 |
| measure | string | いいえ | 計量コード。ilostat_describe_indicator が返す measure.code と完全に一致する値(例:EMP_TEMP_NB)。大文字と小文字は区別されません。内訳を問わず、その計量対象を測定するすべての指標を対象にします。 |
| subject | string | いいえ | 主題コード。例:LUU(失業および労働力の未活用)。大文字と小文字は区別されません。ilostat_list_reference の topic subjects に一覧があります。 |
| database | string | いいえ | ソースデータベースコード。例:LFS、ILOEST(ILO のモデル推計)。大文字と小文字は区別されません。ilostat_list_reference の topic databases に一覧があります。 |
| breakdown | string | いいえ | 指標の内訳に使用する分類タイプ。例:AGE、ECO、GEO、SEX。大文字と小文字は区別されません。ilostat_list_reference の topic classification_types に一覧があります。 |
| frequency | enum | いいえ | この頻度のデータセットのみを残します。A は年次、Q は四半期、M は月次です。各ヒットのデータセットを絞り込み、該当するものがなくなった指標は除外します。A | Q | M |
| aggregates_only | boolean | いいえ | World、地域、または所得グループの行を含むデータセットのみを残し、それらがない指標は除外します。 |
詳細
@cyanheads/ilostat-mcp-server
ILOSTATの労働指標を検索し、系列を照会・比較し、国別プロフィールを作成し、MCP経由でSQLを実行します。STDIOまたはStreamable HTTPに対応しています。
公開ホストサーバー: https://ilostat.caseyjhand.com/mcp
概要
ILOSTATは、国際労働機関のデータベースで、労働統計を提供しています。指標を検索し、国、地域、所得グループの観測値を取得して、地域間で比較し、労働市場のプロフィールを作成できます。すべての値には、報告値、モデル推計値、予測値のいずれかが明示されます。APIキーは不要です。
ツール
| ツール | 説明 |
|---|---|
ilostat_search_indicators | 平易な言葉での用語とフィルターを使って指標カタログを検索します。各検索結果には、利用可能な頻度ごとのデータセット ID が表示されます |
ilostat_describe_indicator | 1 つのデータセットについて、定義、単位と倍率、使用中の内訳コード、対象地域、値の分類方法を説明します |
ilostat_query_indicator | 地域または地域グループ、性別、内訳コード、出典、期間で絞り込み、1 回の呼び出しで最大 3 つのデータセットの観測値を取得します |
ilostat_get_country_profile | 1 つの地域の主要な労働市場統計を、最新の報告値と最新の ILO モデル推計値を並べて表示します |
ilostat_compare_geographies | 1 つのデータセットの 1 つのスライスについて、共通期間または最新期間の地域を順位付けし、任意で N 年間の変化も表示します |
ilostat_list_reference | ILOSTAT のコード体系を解読します。地域、地域グループ、データベース、主題、性別、内訳、出典、ステータスフラグ、注記が対象です |
ilostat_dataframe_describe | ステージングされた df_<id> データフレームを名前で説明するか、すべて一覧表示します(認証方式が none の HTTP では無効)。由来、対象範囲、基準数、列スキーマを表示します |
ilostat_dataframe_query | ステージングされたデータフレームに対して読み取り専用の SQL SELECT を 1 つ実行し、任意で結果を新しいデータフレームとして保存します |
ilostat_dataframe_drop | TTL が切れる前に、ステージングされたデータフレームを削除します |
ilostat_dataframe_drop は ILOSTAT_DATAFRAME_DROP_ENABLED=true でない限り無効です。また、CANVAS_PROVIDER_TYPE=none にすると、3 つすべてのデータフレームツールが無効になります。
機能リファレンス
ilostat_search_indicators ツール
- 平易な言葉での
query(すべての用語が単語または単語の接頭辞に一致する必要があり、大文字・小文字、アクセント、labour/labor の違いは同一視されます)に加え、frequency、database、subject、breakdown、measure、aggregates_onlyの各フィルターを指定できます。フィルターで検索する場合はqueryを省略します - 1 ページあたり最大 50 件(デフォルトは 10 件。
limitに 50 より大きい値を指定すると 50 件に適用され、その旨が通知されます)。next_cursorで次のページに進みます。各検索結果には、頻度ごとのdataset_id、対象年、n_ref_area、last_update、has_aggregatesが含まれます。facetsには一致する全項目の件数が表示されます - 認識されない
database、subject、breakdown、measureのコードを指定すると、unknown_filter_codeエラーになります
ilostat_describe_indicator ツール
- 1 つの
dataset_id(UNE_DEAP_SEX_AGE_RT_A)、または頻度を問わずすべてを説明する指標コードを指定します。認識されないコードの場合は、found: falseとguidanceが返されます - 定義、
unitとそのmultiplier、頻度のバリエーション、breakdowns(性別コード、および合計がis_totalとしてマークされたclassif1/classif2コード)、default_slice、対象となるref_areas、basis_rule、最初の 20 件のrelated_datasetsとrelated_totalが含まれます - SDMX API が応答できない場合、
structure_statusはunavailableとなり、エラーにはならず、内訳、単位、地域が返されません
ilostat_query_indicator ツール
dataset_idsは最大 100 件まで指定できます。最初の異なるデータセット 3 件が照会され、残りは次の呼び出し用にremaining_dataset_idsとして返されます。ref_areas(最大 300 件)および/またはarea_group、sex、classif1、classif2、sources、期間で絞り込みます。期間は、特定のtime、年の範囲を指定するtime_from/time_to、latest_only、またはその両方で指定できますlatest_onlyを指定すると、各系列で独自の最新期間が使われます。全期間のデータが 1 回の呼び出しで読み取るには大きすぎる場合、地域とデータセットごとの最新期間に切り替わり、applied_filters.latest_modeと通知にその旨が示されますsource_selectionはデフォルトでbestです。allまたはsecondaryも指定できます。行にはsource、obs_status、notes、basisが含まれ、これらはlegendで解読されます。applied_filtersには送信されたすべてのパラメーターが反映されます- インラインプレビューの上限を超える結果は、
df_<id>のdataframeとして全件ステージングされます。ILOSTAT_MAX_ROWSを超えるリクエストは、フィルターなしの場合はrequest_too_broad、フィルターありの場合はresult_too_largeで失敗します
ilostat_get_country_profile tool
- 年次データを含む1つの
ref_area。ISO3 国コード(KEN)または X コードの集計値(X01:世界、地域、所得グループ)と、sex(デフォルトはSEX_T、またはSEX_M、SEX_F) - 9つの主要指標(労働力率、就業者・人口比率、失業、若年失業、若年層の就学・就業・職業訓練のいずれにも参加していない状態(NEET)、インフォーマル雇用、就業、労働所得分配率、ワーキングプア)。各指標について、その区分での最新の
reported値と、それとは別に、最新の非予測modelled推計値を含みます reported値がない場合は欠損のままとなり、reported_missingに記載されます。集計値にはmodelled値のみが含まれます
ilostat_compare_geographies tool
- 1つの
dataset_idと1つの区分(sex、classif1、classif2。デフォルトはデータセットの合計値)。対象地域はref_areas(最大300件)、area_group、またはその両方で指定し、少なくとも1つは必須です periodを指定すると、すべての地域で同じ期間の値を取得します。指定しない場合は、include_projectionsが有効でない限り予測値を除外し、各地域のlookback_years(デフォルトは10年)以内の最新値を取得します。change_years(1~30年)を指定すると、その期間における各値の変化も追加されます- 変化には、比較元の値の
source、basis、status、notesが引き継がれ、source_changed、basis_changed、break_in_seriesのフラグが付きます。通知には、同条件で比較できない変化の件数が含まれます - 各行には
rank、value、period、basis、sourceが含まれます。値がない地域はreasonとともにmissingに格納され、comparabilityにはmixed_periods、basis_counts、distinct_sourcesが示されます
ilostat_list_reference tool
topic:ref_areas、area_groups、databases、subjects、sexes、classifications、classification_types、sources、obs_status、notes、frequencies- テキストの
filter、または最大100件の完全一致するcodesを指定します(見つからないコードはnot_foundに記載されます。area_groupsを完全一致で検索すると、加盟国の一覧が表示されます)。ref_areaを指定するとsourcesが絞り込まれ、classification_typeを指定するとclassificationsが絞り込まれます - 1ページあたり最大500件(デフォルトは50件。より大きな
limitは500件として適用され、その旨の通知が表示されます)。next_cursorを使用して続きのページを取得します
ilostat_dataframe_describe tool
- 1つの
df_XXXXX_XXXXXを渡すか、nameを省略してステージング済みデータフレームをすべて新しい順に一覧表示します(認証方式がnoneの HTTP では一覧表示は無効です。正確な名前を使用してください) - 各項目には、生成元の
source_toolとそのquery_params、datasets、coverage、basis_counts、attribution、created_at/expires_at、row_count、SQL の実行に使うcolumn_schemaが含まれます - 各データセットでは、単位の完全な情報が
unitのほかに保持されます:unit_measure、unit_type、unit_type_label、unit_multiplier、unit_multiplier_label。値が再スケーリングされることはありません
ilostat_dataframe_query tool
df_<id>テーブルに対して、DuckDB のSELECT文を1つ実行します(結合、集計、ウィンドウ関数、CTE に対応)。最大20,000文字です。書き込み、DDL、複数文の SQL、ファイル参照とファイル読み取り関数、エンジン設定の読み取り、システムカタログは拒否されますrow_limitはマテリアライズされる行数の上限です(デフォルトは1,000件。1回の呼び出しにつき最大10,000件に制限され、上限に達するとrow_count_cappedフラグが設定されます)。previewはインラインで返される行数を指定し、ILOSTAT_PREVIEW_CHARSに達した場合も停止します。applied_limitsには適用された値が示され、BIGINT 値は文字列として返されますregister_asを指定すると、結果全体を新しいデータフレームとして保存し、新しい TTL が設定されます。結果が1,000,000行を超える場合はregister_as_too_largeとして失敗し、容量を確保するために削除された古いデータフレームはevictedに記載されます
ilostat_dataframe_drop tool
nameで指定したステージング済みデータフレームを、TTL の期限前に1つ削除します。冪等で、該当するものがない場合はdropped: falseとなりますILOSTAT_DATAFRAME_DROP_ENABLED=trueかつデータフレームが有効な場合にのみ一覧表示されます。破壊的操作を行う唯一のツールです
特徴
@cyanheads/mcp-ts-core を基盤としており、stdio と Streamable HTTP のトランスポート、プラグイン可能な認証(none / jwt / oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレーシングを備えた構造化ログを提供します。
ILOSTAT 固有の機能:
- キー不要の ILO API を 2 つ使用します。ILOSTAT データ API はカタログ、コード辞書、観測値を提供し、ILO SDMX API は各データセットの内訳コード、デフォルトのスライス、単位を提供します
- カタログとコード辞書はメモリに保持され、
ILOSTAT_CATALOG_REFRESH_HOURSごとに再確認されます。ツールが受け取るすべてのコードは、上流へのリクエスト前にこれらの情報と照合して検証されます - 上流ホストごとにリクエストペーサーを設けています。429 またはチャレンジページが発生すると、再試行可能な
upstream_busyとしてretryAfterとともに呼び出し元に返されます。最大 5,000 行のデータレスポンスは、ILOSTAT_CACHE_TTL_SECONDSの期間キャッシュされます - データフレームはデフォルトで有効です。
ILOSTAT_PREVIEW_CHARSを超えるクエリや比較は、DuckDB のdf_<id>テーブルとして全件ステージングされ、ILOSTAT_DATASET_TTL_SECONDSの期間保持されます。テナントごとに最大 1,000,000 行、100 個のデータフレームを保持でき、古いものは削除されてevictedに名前が記録されます。CANVAS_PROVIDER_TYPE=noneの場合、または.mcpbバンドル内(DuckDB バインディングなし)の場合、結果はインラインプレビューまでとなり、その旨が示されます - ILOSTAT のデータとメタデータは、CC BY 4.0 の ILO オープンアクセス方針に基づいて公開されています。すべてのデータレスポンスには、数値とともに保持すべき
attributionが含まれます
エージェント向けの出力:
- すべての値に根拠を付与します。各行は
reported、modelled_estimate、projectionのいずれかで、結果にはbasis_countsが含まれます。国別プロファイルでは報告値とモデル値を別々のフィールドで返し、一方の値で他方を補完することはありません - 出所とデコード情報:行には
source、obs_status、注記コードが保持され、それらを解読するlegendが付属します。クエリと比較のレスポンスには、デフォルト値を含むapplied_filtersが返されます - 該当なしもデータとして扱います。不明なデータセットは
guidanceとともにfound: falseを返し、値のない比較対象地域は型付きのreasonとともにmissingに格納されます - 型付きエラー:失敗時には理由(
unknown_code、request_too_broad、upstream_busy、…)と復旧のヒントが含まれます
はじめに
公開ホストインスタンス
公開インスタンスを https://ilostat.caseyjhand.com/mcp で利用できます。インストールは不要です。Streamable HTTP を介して、任意の MCP クライアントから接続してください。
{
"mcpServers": {
"ilostat-mcp-server": {
"type": "streamable-http",
"url": "https://ilostat.caseyjhand.com/mcp"
}
}
}
ホストインスタンスのすべての呼び出し元で、ILO API ごとのリクエストペーサーと 1 つのデータフレームワークスペースを共有するため、ilostat_dataframe_describe ではテーブルの正確な名前を指定します。一覧表示は無効です。
セルフホスト/ローカル
以下を MCP クライアントの設定ファイルに追加してください。
{
"mcpServers": {
"ilostat-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/ilostat-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または npx を使用します(Bun は不要です)。
{
"mcpServers": {
"ilostat-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/ilostat-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または Docker を使用します。
{
"mcpServers": {
"ilostat-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/ilostat-mcp-server:latest"]
}
}
}
Streamable HTTP の場合は、トランスポートを設定してサーバーを起動します。
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
前提条件
- Bun v1.4.0 以降(または Node.js v24 以降)。
- API キーやアカウントは不要です。どちらの ILO API も公開されています。
インストール
- リポジトリをクローンします。
git clone https://github.com/cyanheads/ilostat-mcp-server.git
- ディレクトリに移動します。
cd ilostat-mcp-server
- 依存関係をインストールします。
bun install
- 環境を設定します。
cp .env.example .env
# every variable is optional; see Configuration below
設定
| 変数 | 説明 | デフォルト |
|---|---|---|
ILOSTAT_CATALOG_REFRESH_HOURS | カタログの更新を確認する間隔(時間単位、1~168)。 | 6 |
ILOSTAT_MAX_ROWS | 1 回のクエリで返す、またはステージングする行数の上限(1,000~1,000,000)。 | 500000 |
ILOSTAT_PREVIEW_CHARS | インラインプレビューの予算(シリアライズ後の文字数、1,000 以上)。これを超える結果はデータフレームとしてステージングされます。 | 40000 |
ILOSTAT_CACHE_TTL_SECONDS | 最大 5,000 行の上流データレスポンスをキャッシュする秒数。0 にするとキャッシュが無効になります。 | 900 |
ILOSTAT_DATASET_TTL_SECONDS | ステージングされたデータフレームのテーブルごとの TTL(秒単位、60 以上)。 | 86400 |
ILOSTAT_DATAFRAME_DROP_ENABLED | true に設定すると、ilostat_dataframe_drop が公開されます。 | false |
CANVAS_PROVIDER_TYPE | ステージングされたデータフレームの DataCanvas エンジン:duckdb、またはデータフレームと 3 つのデータフレームツールを無効にする場合は none。 | duckdb |
MCP_TRANSPORT_TYPE | トランスポート:stdio または http。 | stdio |
MCP_HTTP_PORT | HTTP サーバーのポート。 | 3010 |
MCP_SESSION_MODE | HTTP セッションモード:stateless、stateful、または auto。 | stateless |
MCP_AUTH_MODE | 認証:none、jwt、または oauth。 | none |
MCP_LOG_LEVEL | ログレベル(debug、info、warning、error など)。 | info |
LOGS_DIR | ログファイルのディレクトリ(Node.js のみ)。 | <app-root>/logs |
STORAGE_PROVIDER_TYPE | ストレージバックエンド:in-memory、filesystem、supabase、cloudflare-kv/r2/d1。 | in-memory |
OTEL_ENABLED | OpenTelemetry を有効にします。 | false |
省略可能なオーバーライドの一覧は、.env.example を参照してください。
サーバーの実行
ローカル開発
-
本番バージョンをビルドして実行する:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio -
チェックとテストを実行する:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
プロジェクト構成
| ディレクトリ | 用途 |
|---|---|
src/index.ts | createApp() のエントリーポイントです。デフォルトでデータフレームを有効にし、ツールを登録して、カタログの読み込みを開始します。 |
src/config | サーバー固有の環境変数の解析と、Zod による検証を行います。 |
src/mcp-server/tools | ツール定義(*.tool.ts)と、それらで共有する入力およびレンダリング用ヘルパーです。ツールは 9 個あります。 |
src/services/rplumber、src/services/sdmx | src/services/upstream の間隔制御と再試行に対応した HTTP レイヤーを使用する、ILOSTAT データ API および ILO SDMX API 用のクライアントです。 |
src/services/catalog | インメモリのカタログスナップショット、指標の検索、参照リスト、ページングを扱います。 |
src/services/structure | 指標ごとの SDMX 構造と単位をキャッシュします。 |
src/services/observations | リクエストの検証、サイズの事前チェック、行のデコード、比較、レスポンスのキャッシュを行います。 |
src/services/profile | 国の概要プロフィールを扱います。 |
src/services/basis | 各値を報告値、モデル推計値、または予測値に分類するルールです。 |
src/services/canvas-bridge | DataCanvas アダプター:df_<id> のステージング、来歴、SQL、削除を扱います。 |
tests/ | 上流の記録済みフィクスチャを使い、src/ に対応した Vitest テストスイートです。 |
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md を参照してください。要点は次のとおりです。
- ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジックでは
try/catchを使いません - ログには
ctx.logを、ストレージにはctx.stateを使用します - 新しいツールは
src/mcp-server/tools/definitions/index.tsのbuildToolDefinitions()に登録します - 外部 API の呼び出しは、ラップしてから、未加工データを検証 → ドメイン型に正規化 → 出力スキーマを返す、という順に処理します。不足しているフィールドを捏造してはいけません
コントリビューション
Issue を歓迎します。提出前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
このプロジェクトは Apache 2.0 License の下でライセンスされています。詳細は LICENSE ファイルを参照してください。ツールが返す ILOSTAT データは International Labour Organization に帰属し、CC BY 4.0 の下で公開されています。ILOSTAT とデータセット ID を引用してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。